环境:antlr 4.7.1
语法是:grammar Whilelang;
program : seqStatement;
seqStatement: statement (';' statement)* ;
statement: ID ':=' expression # attrib
| 'print' Text # print
| '{' seqStatement '}' # block
;
expression: INT # int
| ID # id
| expression ('+'|'-') expression # binOp
| '(' expression ')' # expParen
;
bool: ('true'|'false') # boolean
| expression '=' expression # relOp
| expression '<=' expression # relOp
| 'not' bool # not
| bool 'and' bool # and
| '(' bool ')' # boolParen
;
INT: ('0'..'9')+ ;
ID: ('a'..'z')+;
Text: '"' .*? '"';
Space: [ \t\n\r] -> skip;
输入语言代码为:
a := 1
b := 2
根据语法,Antlr4应输出错误 - “expect';'在第1行“用于上述输入语言代码。但实际上。没有错误输出,似乎语法只接受部分输入,并没有消耗所有输入令牌。 这是antlr4的错误吗?
$ grun Whilelang program -trace
a := 1
b := 2
^d
enter program, LT(1)=a
enter seqStatement, LT(1)=a
enter statement, LT(1)=a
consume [@0,0:0='a',<17>,1:0] rule statement
consume [@1,2:3=':=',<2>,1:2] rule statement
enter expression, LT(1)=1
consume [@2,5:5='1',<16>,1:5] rule expression
exit expression, LT(1)=b
exit statement, LT(1)=b
exit seqStatement, LT(1)=b
exit program, LT(1)=b
答案 0 :(得分:1)
不是错误。 ANTLR完全按照要求去做。
给出规则
program : seqStatement;
seqStatement: statement (';' statement)* ;
当至少有一个program
匹配时,statement
规则就完全完成了。由于解析器无法有效匹配另一个statement
- 每个语法可选 - 它会停止。
更改为
program : seqStatement EOF;
要求program
规则与statements
匹配,直到它也匹配EOF
令牌(词法分析器会在源文本的末尾自动添加EOF
)。这可能是您正在寻找的行为。