解析器没有包含所有令牌,这是一个错误吗?

时间:2018-06-10 03:09:22

标签: antlr antlr4

环境: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

1 个答案:

答案 0 :(得分:1)

不是错误。 ANTLR完全按照要求去做。

给出规则

program : seqStatement;
seqStatement: statement (';' statement)* ;

当至少有一个program匹配时,statement规则就完全完成了。由于解析器无法有效匹配另一个statement - 每个语法可选 - 它会停止。

更改为

program : seqStatement EOF;

要求program规则与statements匹配,直到它也匹配EOF令牌(词法分析器会在源文本的末尾自动添加EOF)。这可能是您正在寻找的行为。