我使用ANTLR Version4创建编译器。第一阶段是Lexer部分。我创建了“compilerlexer.g4”文件,并在其中输入了lexer规则。
compilerlexer.g4:
lexer grammar CompilerLexer;
INT : 'int' ; //1
FLOAT : 'float' ; //2
BEGIN : 'begin' ; //3
END : 'end' ; //4
To : 'to' ; //5
NEXT : 'next' ; //6
REAL : 'real' ; //7
BOOLEAN : 'bool' ; //8
.
.
.
NOTEQUAL : '!=' ; //46
AND : '&&' ; //47
OR : '||' ; //48
POW : '^' ; //49
ID : [a-zA-Z]+ ; //50
WS
: ' ' -> channel(HIDDEN) //50
;
parser grammar CompilerParser;
options { tokenVocab = CompilerLexer; }
STATEMENT : EXPRESSION SEMIC
| IFSTMT
| WHILESTMT
| FORSTMT
| READSTMT SEMIC
| WRITESTMT SEMIC
| VARDEF SEMIC
| BLOCK
;
BLOCK : BEGIN STATEMENTS END
;
STATEMENTS : STATEMENT STATEMENTS*
;
EXPRESSION : ID ASSIGN EXPRESSION
| BOOLEXP
;
RELEXP : MODEXP (GT | LT | EQUAL | NOTEQUAL | LE | GE | AND | OR) RELEXP
| MODEXP
;
.
.
.
VARDEF : (ID COMA)* ID COLON VARTYPE
;
VARTYPE : INT
| FLOAT
| CHAR
| STRING
;
compileUnit
: EOF
;
有几十个这样的警告和错误。病因是什么?
一般问题:使用组合语法和单独使用lexer和parser有什么不同?如何连接单独的语法和lexer文件?
Lexer规则以大写字母开头,解析器规则以小写字母开头。在解析器语法中,不能定义令牌。而且由于ANTLR认为所有的大写规则都是lexer规则,所以它会产生这些错误/警告。
用户2998131写道:
一般问题:使用组合语法和单独使用lexer和parser有什么不同?
grammar P;
r1 : 'foo' r2;
r2 : r3 'foo '; // added an accidental space after 'foo'
parser grammar P
options { tokenVocab=L; }
r1 : FOO r2;
r2 : r3 FOO;
lexer grammar L;
FOO : 'foo';
注意,您还可以导入语法,这是不同的:https://github.com/antlr/antlr4/blob/master/doc/grammars.md#grammar-imports
我有一个处理AND和OR表达式的antlr规则。看起来是这样的: 这将生成一个非常深的解析树。E、 g.如果你有 结果是这样的树: 这可能会变得非常深入和昂贵,所以我想添加一个优化。我想同时处理多个顺序AND表达式(类似于OR-s)。 所以我想这样做: 我认为这将为序列中的所有And-s生成一个节点。 然而,当我这样做的时候,antlr仍然选择生成递归树。我想那是因为规则是模棱两可的。有什么想法可
我正在尝试从Cisco IOS配置解析以下命令:
我希望第一个grammar1(输出正确的结果)产生与grammar2(错误的输出)相同的结果。这背后的原因是:唯一允许'-'作为第一个令牌的规则是#unaryexpr,所以由任何语法生成的解析器都会首先尝试匹配该规则。然后,如果解析器是贪婪的(对于两种语法中的任何一种),我希望它将“(5+9)+1000”作为一个整体,并将其与expr匹配,因为它是一个有效的expr。 我推理的错在哪里?
您好,我需要一些关于使用antlr和java构建简单解析树的帮助。我曾尝试使用powershell编译和运行语法文件(即pascal.g4文件),我希望从中生成一些java文件,但有时我尝试使用命令“\antlr.bat-package pdl-o pdl。\pascal.g4”在powershell上收到一条消息,说明“系统找不到指定的文件”。 我想我输入的命令可能是错误的,但无论如何,我已经得
基本上,我想结合这些g4文件: https://github.com/apache/groovy/tree/master/src/antlr 进入一个文件,我可以使用这个clojure库: https://github.com/aphyr/clj-antlr 它目前需要一个组合的解析器/词法器文件。如何破解这些文件,使它们以正确的语法存在于单个文件中?我已经排除了连接文件和删除lexer和para
我已经尝试了整整一周使用antlr构建一个语法,允许我解析电子邮件消息。 我的目标不是将整个电子邮件彻底解析为令牌,而是将其分解为相关部分。 这是我必须处理的文档格式。描述不属于消息一部分的内联注释: 我面临的问题如下: 我没有想出一个好方法来跳过消息开头的文本,并在找到标记后才开始应用解析规则。截面类型1 捕获节开始和句子标记之间节内的所有文本 在SECTION\u结束标记之后,忽略后面的所有文