Math ANTLRWorks-代码生成陷入停滞,无法生成
我使用以下语法定义算术表达式的语法。这是一个更复杂的整体的子集,但问题只有在我扩展语法以包含逻辑运算时才会出现 当我尝试使用antlrworks编写gen代码时,甚至需要很长时间才能开始生成。我认为问题在于paren的规则,因为它包括一个到expr开头的循环。如果能帮上忙,那就太好了 提前谢谢 使用的选项包括:Math ANTLRWorks-代码生成陷入停滞,无法生成,math,antlr,grammar,expression,antlrworks,Math,Antlr,Grammar,Expression,Antlrworks,我使用以下语法定义算术表达式的语法。这是一个更复杂的整体的子集,但问题只有在我扩展语法以包含逻辑运算时才会出现 当我尝试使用antlrworks编写gen代码时,甚至需要很长时间才能开始生成。我认为问题在于paren的规则,因为它包括一个到expr开头的循环。如果能帮上忙,那就太好了 提前谢谢 使用的选项包括: options { tokenVocab = MAliceLexer; backtrack = true; } 语法代码如下: type returns [ASTTypeNode
options {
tokenVocab = MAliceLexer;
backtrack = true;
}
语法代码如下:
type returns [ASTTypeNode n]
: NUMBER {$n = new IntegerTypeNode();}
| LETTER {$n = new CharTypeNode();}
| SENTENCE { $n = new StringTypeNode();}
;
term returns [ASTNode n]
: IDENTIFIER {$n = new IdentifierNode($IDENTIFIER.text);}
| CHAR {$n = new LetterNode($CHAR.text.charAt(1));}
| INTEGER {$n = new NumberNode(Integer.parseInt( $INTEGER.text ));}
| STRING { $n = new StringNode( $STRING.text ); }
;
paren returns [ASTNode n]
:term { $n = $term.n; }
| LPAR expr RPAR { $n = $expr.n; }
;
negation returns [ASTNode n]
:BITNEG (e = negation) {$n = new BitNotNode($e.n);}
| paren {$n = $paren.n;}
;
unary returns [ASTNode n]
:MINUS (u =unary) {$n = new NegativeNode($u.n);}
| negation {$n = $negation.n;}
;
mult returns [ASTNode n]
: unary DIV (m = mult) {$n = new DivideNode($unary.n, $m.n);}
| unary MULT (m = mult) {$n = new MultiplyNode($unary.n, $m.n);}
| unary MOD (m=mult) {$n = new ModNode($unary.n, $m.n);}
| unary {$n = $unary.n;}
;
binAS returns [ASTNode n]
: mult PLUS (b=binAS) {$n = new AdditionNode($mult.n, $b.n);}
| mult MINUS (b=binAS) {$n = new SubtractionNode($mult.n, $b.n);}
| mult {$n = $mult.n;}
;
comp returns [ASTNode n]
: binAS GREATEREQ ( e =comp) {$n = new GreaterEqlNode($binAS.n, $e.n);}
|binAS GREATER ( e = comp ) {$n = new GreaterNode($binAS.n, $e.n);}
|binAS LESS ( e = comp ) {$n = new LessNode($binAS.n, $e.n);}
|binAS LESSEQ ( e = comp ) {$n = new LessEqNode($binAS.n, $e.n);}
|binAS {$n = $binAS.n;}
;
equality returns [ASTNode n]
: comp EQUAL ( e = equality) {$n = new EqualNode($comp.n, $e.n);}
|comp NOTEQUAL ( e = equality ) {$n = new NotEqualNode($comp.n, $e.n);}
|comp { $n = $comp.n; }
;
bitAnd returns [ASTNode n]
: equality BITAND (b=bitAnd) {$n = new BitAndNode($equality.n, $b.n);}
| equality {$n = $equality.n;}
;
bitXOr returns [ASTNode n]
: bitAnd BITXOR (b = bitXOr) {$n = new BitXOrNode($bitAnd.n, $b.n);}
| bitAnd {$n = $bitAnd.n;}
;
bitOr returns [ASTNode n]
: bitXOr BITOR (e =bitOr) {$n = new BitOrNode($bitXOr.n, $e.n);}
| bitXOr {$n = $bitXOr.n;}
;
logicalAnd returns [ASTNode n]
: bitOr LOGICALAND (e = logicalAnd){ $n = new LogicalAndNode( $bitOr.n, $e.n ); }
| bitOr { $n = $bitOr.n; }
;
expr returns [ASTNode n]
: logicalAnd LOGICALOR ( e = expr ) { $n = new LogicalOrNode( $logicalAnd.n, $e.n); }
| IDENTIFIER INC {$n = new IncrementNode(new IdentifierNode($IDENTIFIER.text));}
| IDENTIFIER DEC {$n = new DecrementNode(new IdentifierNode($IDENTIFIER.text));}
| logicalAnd {$n = $logicalAnd.n;}
;
`这似乎是3.3版(及更高版本)中引入的错误。从语法生成解析器时,ANTLR 3.2会产生以下错误: 警告(205):Test.g:31:2:ANTLR无法在规则平等中分析此决定;这通常是因为从备选方案的左边缘可以看到递归规则引用。ANTLR将以k=1的固定前瞻重新分析决策。考虑使用“选项{k=1;}”用于该决策,并可能添加句法谓词。 错误(10):内部错误:org.antlr.tool.Grammar.createLookaheadDFA(Grammar.java:1279):甚至无法为决策6执行k=1;原因:超时(>1000ms) 在我看来,你使用了LR语法作为你的ANTLR语法的基础。考虑一下重新开始,然后在脑海里分析。查看以下问答,了解如何使用ANTLR解析表达式: 另外,我看到您使用了一些看起来非常相似的标记:
字母
,字符
,句子
和标识符
。您必须意识到,如果所有规则都以小写字母开头,则只匹配其中一个规则(匹配最多的规则,或者如果是并列规则,则为lexer语法中首先定义的规则)。lexer不会根据解析器的“请求”生成令牌,而是独立于解析器创建令牌
最后,对于一个简单的表达式解析器,您确实不需要谓词(而且backtrack=true
会导致ANTLR在所有解析器规则之前自动插入谓词!)