我对ANTLR很新,所以这可能是一个简单的问题 我已经定义了一个简单的语法,它应该包含带有数字和标识符的算术表达式(以字母开头并以一个或多个字母或数字开头的字符串。)
语法如下:
grammar while;
@lexer::header {
package ConFreeG;
}
@header {
package ConFreeG;
import ConFreeG.IR.*;
}
@parser::members {
}
arith:
term
| '(' arith ( '-' | '+' | '*' ) arith ')'
;
term returns [AExpr a]:
NUM
{
int n = Integer.parseInt($NUM.text);
a = new Num(n);
}
| IDENT
{
a = new Var($IDENT.text);
}
;
fragment LOWER : ('a'..'z');
fragment UPPER : ('A'..'Z');
fragment NONNULL : ('1'..'9');
fragment NUMBER : ('0' | NONNULL);
IDENT : ( LOWER | UPPER ) ( LOWER | UPPER | NUMBER )*;
NUM : '0' | NONNULL NUMBER*;
fragment NEWLINE:'\r'? '\n';
WHITESPACE : ( ' ' | '\t' | NEWLINE )+ { $channel=HIDDEN; };
我正在使用带有ANTLR IDE Eclipse插件的ANTLR v3。当我使用解释器解析表达式(8 + a45)
时,只生成部分解析树:
alt text http://i43.tinypic.com/or4idw.png
为什么第二个术语(a45)没有被解析?如果两个术语都是数字,也会发生同样的情况。
谢谢,
Martin Wiboe
答案 0 :(得分:4)
您需要创建一个解析器规则,其中包含EOF
(文件结尾)标记,以便强制解析器遍历整个标记流。
将此规则添加到语法中:
parse
: arith EOF
;
让解释器从该规则开始,而不是arith
规则: