Antlr 简单语法和标识符

我为ANTLR写了这个简单的语法 grammar ALang; @members { public static void main(String[] args) throws Exception { ALangLexer lex = new ALangLexer(new ANTLRFileStream("antlr/ALang.al")); CommonTokenStream tokens = new CommonTokenStream(lex); ALang

ANTLR AST语法问题不匹配的令牌异常

我真正的语法要复杂得多,但我可以把我的问题写下来。这就是语法: grammar test2; options {language=CSharp3;} @parser::namespace { Test.Parser } @lexer::namespace { Test.Parser } start : 'VERSION' INT INT project; project : START 'project' NAME TEXT END 'project'; START: '/beg

ANTLR规则可以自己工作,但当包含在另一个规则中时失败

我正在尝试为重新解析和重新标记的kconfig文件编写ANTLR语法(重新标记以解决一些歧义)。语法的简化版本为: grammar FailureExample; options { language = Java; } @lexer::header { package parse.failure.example; } reload : configStatement* EOF ; configStatement : CONFIG IDENT configOptions ; c

Antlr 多方案

我想有一些基本的东西我不明白。我觉得下面的语法很简单。从规则“parse”开始,在我看来没有太多模棱两可的地方。但是我得到下面列出的错误。如果有人能解释第一个错误,那会很有帮助 其目的是解析简单的名字,如“约翰·史密斯三世先生和简·史密斯夫人”或“史密斯,约翰” parse : name+ EOF ; // match Mr. John or Smith, name : NAMESEP? SALUTATION* NAME (firstlast | lastcommafi

从stringstream创建antlr3输入流?(antlr3 C-target)

我当前正在从如下文件创建输入流: pANTLR3_UINT8 inputFile = (pANTLR3_UINT8) "X:/Path/To/File"; pANTLR3_INPUT_STREAM input = antlr3AsciiFileStreamNew(inputFile); 但是,我想从stringstream创建一个输入流。这可能吗?这不可能直接实现,但您可以将stringstream转换为字符串并将其用作输入,如: input = antlr3StringStreamNew

规范化ANTLR中的标记文本

在ANTLR中是否有方法将某些标记标记为具有规范输出 例如,给定语法(摘录) 单词将与“FOO BAR BAZ”、“FOO BAR BAZ”、“FOO BAR BAZ”等匹配 当我调用TokenStream#getText(Context)时,它将返回连接在一起的令牌的实际文本 是否有一种方法可以“规范化”此输出,以便无论输入是什么,所有FOO标记都呈现为“FOO”、BAR标记呈现为“BAR”,而BAZ标记呈现为“BAZ”(例如) 鉴于上述任何输入,我希望输出“Foo Bar Baz”。以下任何

Antlr 结果不一致

我使用的是AntlR4.6,我试图对我的语法进行一些清理,结果打破了它。我发现这是因为我做了下面的改变,我认为这是等效的。有人能解释他们为什么不同吗 第一次尝试 DIGIT : [0-9] ; LETTER : [a-zA-Z] ; ident : ('_'|LETTER) ('_'|LETTER|DIGIT)* ; DIGIT : [0-9] ; LETTER : [a-zA-Z_] ; ident : LETTER (LETTER | DIGIT)* ; 第二次尝试 DIGIT : [0

Antlr 规则优先&;解析树

如果有这样的语法 test: x; x : x '+' x | x '*' x | INT ; INT: [0-9]+ (切换的优先级是故意的) 输入如下:6+7*8*9 当我查看解析树时,它看起来像是经过计算的((6+7)*8)*9) 我不明白的是解析树是如何构造的。 在我看来,这就是它的构造方式: Rules applied test test: x x

什么';是更好,ANTLR还是JavaCC?

关注点是文档/可学习性、eclipse集成、工具、社区支持和性能(大致按此顺序排列)。首先,在实践中,对您真正重要的是符号对您的眼睛来说有多方便和直观 话虽如此,我还是用ANTLR和JavaCC做了一些项目,发现ANTLR在大多数方面都非常重要。ANTLR功能更为全面:它是一个非常现成的编译器—词法分析、解析、AST、树转换和代码生成 对于JavaCC来说,它更像是一个解析器生成器,而不是一个编译器。AST支持是通过另一个名为JJTree的库提供的。我很久没有使用解析器生成器了,但几年前我对它们

Antlr中是否有机制允许lexer仅在特定规则期间匹配令牌?

我想在我的语言中添加一个关键字 在一个特定的解析器语法规则期间,只需匹配该关键字 由于向后兼容性,我希望允许这个关键字继续用作变量名,即它可以由lexer规则匹配,该规则确定令牌是否适合变量名 每当在文件中找到新规则时,Lexer都会匹配它 修改var_声明规则以使其匹配IDENT或新的关键字标记是否是解决此问题的适当方法? protected modified_var_declaration: VAR (IDENT|KEYWORD); ; 有关规则如下: IDENT // ma

Antlr 什么';这语法怎么了?

问题是define规则与令牌define、ID、as匹配,但与类型不匹配。我有一个例外 如果我内联类型,如下所示,它将按照我的预期工作: grammar Test; IDHEAD: ('a'..'z' | 'A'..'Z' | '_'); IDTAIL: (IDHEAD | '0'..'9'); ID: (IDHEAD IDTAIL*); fragment TYPE: ('text' | 'number' | 'bool'); define: 'define' ID 'as' T

噪声数据流上的ANTLR第2部分

在与巴特·基尔斯(Bart Kiers)进行了一次非常有趣的讨论之后,我最后遇到了另一个问题 目标仍然是一样的:只提取以下语法的有用信息 VERB : 'SLEEPING' | 'WALKING'; SUBJECT : 'CAT'|'DOG'|'BIRD'; INDIRECT_OBJECT : 'CAR'| 'SOFA'; ANY : . {skip();}; parse : sentenceParts+ EOF

允许在我的antlr语法标记中使用空格

我是antlr新手,正在为DSL编写antlr语法。我跳过了空白来处理它。但是有一种情况,我可以选择让我的语法选择一个可能有空格的特定标记 Token SECATTR使用空格来修剪尾随空格和前导空格。这类似于 aa aa_aa.aa aa_aa aa在解析规则中使用时,作为单个令牌读取,无前导空格 singlerule排序计数(aa aa_aa aa.aa aa_aa aa)>10。 到目前为止,正在形成的树就像 解决在我的解析规则中有空格的问题,例如singleruleCOUNT(aa aa

Antlr 有没有不跳过规则中空格的方法?

我想为我的汇编程序实现一个“.ascii”指令。“…”之间的所有内容都被视为ascii字符串,写入目标文件 mips32code : instruction+ # StartPlace ; instruction : OPCODE_RTYPE rd COMMA rs COMMA rt # RTypeInstruction | OPCODE_ASCII '"' ascii '"'

ANTLR4是否支持将文字名称分配给令牌?

假设语法中定义了不区分大小写的foo标记,如下所示: FOO : F O O ; fragment F:('f'|'F'); fragment O:('o'|'O'); 因为该标记是通过匹配模式而不是文本值定义的,所以返回null Antlr4是否有一种内置方式来指定语法定义中的foo标记的文字值?getSymbolicName(int)应为输入foo返回foo: 几乎在每个ANTLR4运行时类中都有一个toString()方法。对于层次结构元素,如(parse)树和识别上下文,子项列在to

ANTLR4:添加替代标签后,我可以为原始规则添加标签吗?

我添加了一些替代标签,如下所示。现在为enterSomeType,enterSomeOtherType生成解析器方法。但是如何获得原始类型,即:enterType type : IDENTIFIER # someType | typeDescriptor # someOtherType ; 我不确定这是否回答了你的问题(语言?时间?) 在Python中,当我遍历树(因此为“child”)时: rule=str(parser.ruleNames[child.getPayloa

antlr4 lexer令牌无效

试图解析下面的句子,但lexer生成了错误的标记 输入 column(propName="~~" abc="hi") Lexer DOUBLEQUOTED: '"' (E_TILDE | ~ ('"') | E_DOUBLE_QUOTE)* '"'; fragment E_TILDE : '~~' ; fragment E_DOUBLE_QUOTE : '~"' ; 试图解析输入句子,但lexer生成了标记 '"~~" abc="' as double quoted strin

Antlr 否定的lexer规则/标记

我试图匹配(并忽略)c风格的块注释。对我来说,顺序是(1)/*,然后是(2)除/*或*/之外的任何内容,直到(3)*/ BLOCK_COMMENT_START : "/*" ; BLOCK_COMMENT_END : "*/" ; BLOCK_COMMENT : BLOCK_COMMENT_START ( ~( BLOCK_COMMENT_START | BLOCK_COMMENT_END ) )* BLOCK_COMMENT_END {

Antlr C++;一代

在ANTLR版本2.X中,您可以通过下面的代码指定在ANTLR包含之前或之后进行的操作 header "pre_include_hpp" { #pragma warning( push ) #pragma warning( disable : 4511 ) // couldn't generate copy constructor } header "post_include_hpp" { #pragma warning( pop ) } 对于ANTLR v3

Antlr 使AST节点成为递归规则的最低子代

我试图创建一个解析器规则,它允许在第二个规则之前有零个或多个令牌,并且在AST中,每个后续令牌(作为闭包一部分的令牌)都是前一个令牌的子级,第二个规则也是最后一个符号的子级 通过例子更容易解释 expression11 : ((NOT | COMPLEMENT)^)* expression12; 例如,给定上述解析器规则,如果我有表达式!!x(其中x是一个ID),在我的AST中,我希望x是第二个bang操作符的子对象,它是第一个bang操作符的子对象 期望的: ! \ child

语句或退出语句的ANTLR语法

我用ANTLR语法写下以下语句: loopStatement : 'loop' (statement|exit)* 'end' 'loop' ';' ; 如果我理解正确,(语句|退出)*意味着我可以有一个语句或退出语句。就是 i、 estatement\u 1 exit\u 1,或statement\u 1,或statement\u 1 statement\u 2,exit\u 1,对吗? 我的解析器可以工作,而且在没有语句的情况下。 例如: 这项工作: loop x:=x+

如何将Kleene闭包的匹配传递给我在ANTLR中的操作?

我的ANTLR语法中有以下内容: rich_newick_string : str=(.*';') { stack.pushRichNewickString($str.text); }; 我希望将一些字符串匹配传递给我的pushRichNewickString方法,但我得到的却是null。我做错了什么 谢谢。您不能将多个词法分析器/语法分析器规则放在括号内,然后为其指定标签: rule : label=(ruleA ruleB ruleC) { /* use $label.te

ANTLR中的浮点文字和范围参数

我正在为语言D开发一个解析器,当我试图添加“切片”操作符规则时遇到了麻烦。您可以找到它的ANTLR语法。 基本上,问题是如果lexer遇到这样的字符串:“1..2”,它将完全丢失,并最终成为单个浮点值,因此类似“a[10..11]”的字符串的postfixExpression规则最终成为带有显式实数参数的ExpArrIndex对象。有人能解释一下数字文字到底出了什么问题吗?(据我所知,它在这些令牌周围的某个地方失败)来自 源文本使用最大munch技术拆分为标记,即词法分析器尝试使用它所能使用的最

在java中使用Antlr编写的语法

我是这一部分的新手,我想识别以下范围[1-3][0-9]中的两位整数。 我写的是 goal : firstD secondD WS firstD secondD; firstD : '1'|'2'|'3'; secondD : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' ; WS : (' '|'\t'|'\n'|'\r')+ {skip();} ; 但这会产生不匹配的TokenExceptio

Antlr Stringtemplate模板参数始终计算为字符串

我正在使用AntlR4RC1(完整的jar)解析语法,构建自定义ast,并使用stringtemplate4从该ast生成代码(我在AntlRJAR中使用stringtemplate类)。 在一个模板中,我调用另一个带有bean列表的模板 <subtemplate(myListArg=parm.listOfBeans)> 然后在子模板中,我得到一个字符串列表(每个字符串都是一个计算为字符串的bean)。但是我需要的是java bean的列表(例如带有属性的简单java对象),因

ANTLRworks和Java语法问题

我正在通过ANTLR使用Java语法为Java代码生成AST,并使用命令行编译文件,我遇到了以下问题: 当我将antlrworks-1-1.4.3.jar与此一起使用时,以及使用javac编译文件时,我得到了一个错误,即 JavaParser.java:24631: illegal start of expression void =null; ^ 1 error 我尝试过使用antlrworks-1.5.jar和antlr-1.3.jar,在这两个版本中我都

ANTLR输入不匹配?lexer顺序错误?

我已经开始使用Antlr为自定义DSL生成解析器。 该语言获取文件并对其进行过滤 我的语法如下(缩短): 假设我想解析这个输入: 过滤式abc 然后我得到: mismatched input 'filter -type abc ' expecting FILTER 问题是,如果我碰巧lexer规则说明符 SPECIFIER : 'abc' 我输入:过滤型abc它工作得很好 我相信这是一个与贪婪匹配有关的lexer排序问题? 即使我不明白为什么,因为我认为Antlr采用了第一条匹配的lexer

ANTLR3 lexer在期望返回5个令牌时返回一个令牌

您好,我正在尝试构建一个简单的lexer来标记以“;”开头的行性格 这是我的词汇语法: lexer grammar TestLex; options { language = Java; filter = true; } @header { package com.ualberta.slmyers.cmput415.assign1; } IR : LINE+ ; LINE

折叠ANTLR4中的空白

在我的语法中,我有一个空白标记,它被发送到隐藏的频道: SP : [ \u00A0\u000B\t\r\n] -> channel(HIDDEN); 我知道我可以使用TokenStream\getText(Context)获取解析规则的文本,包括隐藏的标记。我希望当我调用它时,所有的空格都折叠起来 我还知道有一个TokenStreamRewriter用于重写特定的令牌,但我看不到重写所有特定类型令牌的方法 有没有办法将所有SP标记折叠为单个空格输出?这可以通过更改规则以匹配一个或多个空格

ANTLR标记歧义

我想解析像Lorem ipsum、dolor和sit amet Concertetur这样的字符串 我需要两个代币 字里行间 还有别的话吗 使用antlr2,如果我定义像 AND_WORD: "AND" ; ANY_OTHER_WORD: ('0'..'9'|'a'..'z'|'A'..'Z'|'_')+ ; 我得到警告:规则之间的词汇不确定性 我怎样才能解决它?我是否应该从任何其他单词定义中排除和单词?为什么要使用ANTLR 2?@Bart Kiers,由于可传递依赖性,我使用另一个依赖于A

Antlr中不明确的Lexer规则

我有一个antlr语法,它有多个与同一个单词匹配的词法规则。在词法分析过程中无法解决这个问题,但通过语法,它就变得毫不含糊了 例如: conversion: NUMBER UNIT CONVERT UNIT; NUMBER: [0-9]+; UNIT: 'in' | 'meters' | ......; CONVERT: 'in'; 输入:1英寸(米) 单词“in”与lexer规则UNIT和CONVERT相匹配 如何在保持语法文件可读性的同时解决此问题?根据您问题中的信息,很难说最好的解决方案

Antlr 动态调用在运行时更新规则

发送AT命令时,它通常由\r\n终止,但实际上,这实际上是两个“寄存器变量”S3和S4 默认情况下,S3='\r'和S4='\n',但用户可以在运行时使用命令ATSx更改它们= 我如何在我的Antlr lexer/解析器中处理这个问题 每个命令的形式为[parameters]S3S4,如果用户更改S3或S4的值,我如何处理 提前感谢您提供的任何帮助。不,AFAIK没有动态更改lexer或parser规则的选项。当然,也有一些可能的解决方法,比如在更改寄存器变量时重新创建lexer/parser’

使用antlr解析|分隔的文件

所以我认为这应该很容易,但我现在很难接受。我试图解析一个|分隔的文件,任何不以|开头的行都是注释。我想我不明白评论是怎么起作用的。它总是在注释行中出错。这是一个遗留文件,因此无法更改它。这是我的语法 grammar Route; @header { package org.benheath.codegeneration; } @lexer::header { package org.benheath.codegeneration; } file: line+; line: route+ '

使用ANTLR解析日志文件

我只是从ANTLR开始,尝试从日志文件中解析一些模式 例如:日志文件: 7114422 2009-07-16 15:43:07078 [LOGTHREAD]信息状态日志-任务0 输入: uk.project.Evaluation.Input.Function1(所选=[“红色”,“黄色]){} 7114437 2009-07-16 15:43:07093 [LOGTHREAD]信息状态日志-任务0 输出: uk.org.project.Evaluation.Output.Function2(se

此antlr示例工作不正常

此ANTLR示例不解析输入“1;”。你能解释一下原因吗?它解析为“11;” 对于java目标,如果您更改: 受保护的 数字 : '0'..'9' ; 到 碎片 数字 : '0'..'9' ; 它会起作用的 希望这对您有所帮助。确认,将“受保护”更改为“碎片”。我明白了。说明:受保护的关键字在早期版本的ANTLR中有效。它在ANTLR 3中不起作用。现在必须使用片段instrade of protected。在ANTLR 3中,受保护的可能被忽略。那么会发生什么呢?ANTLR将INT和DI

ANTLR:异构AST和虚拟令牌

这是我的第一个问题:) 我想用ANTLR构建一个异构AST,用于简单语法。有不同的接口来表示AST节点,例如。GIInfiExp,IVariableDecl。ANTLR提供了CommonTree来保存源代码的所有信息(行号、字符位置等),我想以此作为AST interfacese IINFIXXP实现的基础 为了以CommonTree作为节点类型获得AST作为输出,我设置: options { language = Java; k = 1; output

ANTLR:表达式计算器、分区和pow

我正试图写一个语法来评估表达式。 我从ANTLR网站(it manage+、-和*)上的给定示例开始。 我加了一个除法。但我想通知用户,如果他试图除以0。 此外,我想在我的计算器中添加pow(优先级高于乘除法。(例如2^3=8)。 希望可以理解。 这是我的语法表达式: grammar Expr; @header { import java.util.HashMap; } @members { /** Map variable name to Integer object hold

ANTLR解析多个文件以生成一个AST

如何解析多个源文件,并最终只使用一个AST来执行分析和代码生成?通常,我发现ANTLR的示例用法是 public void process(String source) { ANTLRStringStream Input = new ANTLRStringStream(input); TLexer lex = new TLexer(Input); CommonTokenStream tokens = new CommonTokenStream(lex); TPa

Antlr4中语义谓词的语法

在本文中,Bart Kiers对Antlr3中的不同语义谓词进行了很好的概述 太糟糕了,Antlr4中的语法/语义似乎发生了更改,因此无法编译: end_of_statement : ';' | EOF | {input.LT(1).getType() == RBRACE}? => ; RBRACE : '}' ; 有人能告诉我如何执行end_of_语句的第三种情况:如果下一个标记是“}”,则接受,但不要使用它。现在只有一种语

ANTLR:由于可以从alts访问递归规则调用,规则标记具有非LL(*)决策

我在一门关于计算机科学的课程中学习语法分析/词法分析。为此,我们正在使用ANTLR 我正在修改一种XML语言,因此它不再含糊不清,但当我对语法进行更改时,ANTLR抱怨道 我知道以前有人问过这个问题,但实际上没有什么帮助 当我在突击队提示符下运行ANTLR时,我已经拍摄了错误快照。 以下是XML语法: grammar XML; options { language = Java; } @lexer::members { boolean inTag = true; } xml_file re

Antlrworks-外部输入

我是新手,因此我需要你的帮助。。 我试图解析Wikipedia转储,我的第一步是将它们定义的每个规则映射到ANTLR,不幸的是,我遇到了第一个障碍: 第1行:8外部输入“预期” 我不明白发生了什么事,请帮我一下 我的代码: grammar Test; options { language = Java; } parse : term+ EOF ; term : IDENT | '[[' term ']]' | '\'\'' term

正在从ANTLR4访问者引发异常

我是ANTLR的新手。这是一个语法,我正试图为它编写一个Visitor类 grammar extremelysimpleexpr ; stat : expr ; expr : sub ; sub : add ( '-' add )* ; add : VAL ( '+' VAL )* | VAL ; VAL : [0-9]+ ; [ \t\n\r]+ -> skip ; Vistor.java ......... public Integer vistAd

如何使用ANTLR检查有效的变量名?

我们都知道变量名不能以数字开头。(例如,foo1有效,1foo无效) 我试图编写一个语法文件,只允许有效的变量名,并且它们后面必须跟一个冒号。(这是一个大得多的语法的一部分——我只是停留在这一部分) 看起来应该很简单。我定义了一个规则id,它只接受一个字母值作为其第一个字符,后跟任意数量的字母数字字符。然而,对我来说,看似简单的任务却失败了。有人能解释为什么吗 这是我的语法: grammar validName; var_declaration :VAR id COLON; VAR: 'var

ANTLR语法中[\p{Lu}]的意义

人们应该如何解释这条规则 fragment LETTER_UPPERCASE : [\p{Lu}] ; 在 \p是ANTLR特定的转义序列吗?\p{Lu}或\p{Uppercase\u Letter}是unicode类别。它匹配具有小写变体的大写字母。通过将[和]包裹在其周围,可以将其制成一个 见: \p{Lu}或\p{Uppercase\u Letter}是一个unicode类别。它匹配具有小写变体的大写字母。通过将[和]包裹在其周围,可以将其制成一个 见:

Antlr 是否可以在没有eclipse的情况下使用Xtext?

我有一个DSL(用ANTLR实现),我需要为它编写一个内容辅助/自动完成编辑器。我已经将我的语法原型移植到Xtext,我对它生成的编辑器的质量非常满意 不幸的是,我不能使用Eclipse作为编辑器。相反,我想使用Xtext语法生成一些可以在Eclipse之外重用的工件。据我所见,我需要的最少工件集是: EMF模型 解析器 *提案人,以及 所需的库 有人尝试过在Eclipse之外使用Xtext吗?它依赖于多少个外部库 谢谢 对于后端部分(解析器/序列化程序/格式化程序/元模型等),这不是问题,

Antlr3警告:Decison可以匹配多个备选方案,但我不知道如何匹配

以下是有问题的警告信息: BB_LLVM2AST.g:120:15:决策可以使用多个选项匹配输入,例如“a”…“z”:1,2 因此,该输入禁用了备选方案2 规则如下: fragment IDENTIFIER : ((LOWERCHARS)+ (('0'..'9')+)? PERIOD?)+ | ('0'..'9')+ ; 以下是其他规则: fragment LOWERCHARS : ('a'..'z') ; fragment PERIOD : '.' ; 因此,我尝试使用语法谓词

Antlr 缺少令牌和无关输入

我使用Python3.g4语法,并尝试修改它。我想添加类型提示,从3个字符“#t”开始。它们可以在单独的行和after语句中。 添加和修改的规则: simple_stmt : small_stmt ( ';' small_stmt )* ';'? type_comment? NEWLINE | type_comment NEWLINE ; type_comment : TYPE_COMMENT ; TYPE_COMMENT : '#' 't' ' ' ~[\r\n]* ; 其

Antlr 字符串插值语法,其中格式错误的插值被视为正常字符串

下面是我要分析的语言的子集: 程序由语句组成 语句就是赋值:A=“b” 作业的左侧是一个标识符(所有大写) 赋值的右边是一个用引号括起来的字符串 字符串通过插入括号内的标识符来支持字符串插值(A=“b[C]d”) 到目前为止,这已经足够直截了当了。以下是有效的方法: Lexer: lexer grammar string_testLexer; STRING_START: '"' -> pushMode(STRING); WS: [ \t\r\n]+ -> skip ; ID:

ANTLR4 PLSQL语法问题-将连字符与SQL*Plus命令一起使用

我不熟悉ANTLR并使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle解析器。我对连字符('-')用法的语法有问题 我正在从事一个处理脚本(包括PLSQL命令和SQL*Plus命令)的项目。因此,我的语法需要正确处理大小写和语法分析。我确实找到了53条命令(12.2 Oracle版本) 对于SQLPlus命令,它声明“您可以通过在行尾键入连字符并按Return键继续执行长SQLPlus命令”。 在语法中这样做的一种方法是将连字符后跟行发送到一个隐藏通道中,如下所示 WS :

上一页   1   2   3   4    5   6  ... 下一页 最后一页 共 34 页