Parsing 为什么ANTLR不解析整个输入?

Parsing 为什么ANTLR不解析整个输入?,parsing,antlr,context-free-grammar,Parsing,Antlr,Context Free Grammar,我是ANTLR的新手,所以这可能是一个简单的问题。 我定义了一个简单的语法,它应该包括带有数字和标识符的算术表达式(以字母开头,以一个或多个字母或数字继续的字符串) 语法如下所示: grammar while; @lexer::header { package ConFreeG; } @header { package ConFreeG; import ConFreeG.IR.*; } @parser::members { } arith: term

我是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)
时,只生成解析树的一部分:


为什么第二个术语(a45)没有被解析?如果两个术语都是数字,也会发生同样的情况。

您需要创建一个解析器规则,其中包含
EOF
(文件结尾)令牌,以便解析器将被迫遍历整个令牌流

将此规则添加到语法中:

parse
  :  arith EOF
  ;
让解释器从该规则开始,而不是从
arith
规则开始:


解析的起始规则是什么?我在使用解释器时选择了
arith
作为解析规则。这看起来不是很直观,但它做到了:)谢谢!