语法接受太多

grammar is accepting too much

我是 ANTLR 的新手,并尝试使用一些非常简单的示例(使用 antlr-4.8)。在我看来,这似乎是一个愚蠢的新手问题,但我找不到合适的答案(实际上,除了这个糟糕的标题,我什至不知道如何表达这个问题)。抱歉!

我的语法是这样的。

grammar ExprTest;

expr    :   compareExpr
        |   NUMBER
        ;

compareExpr
        :   (GT | GE | LT | LE) NUMBER
        ;

NUMBER  :   [0-9]+;
GT      :   '>';
GE      :   '>=';
LT      :   '<';
LE      :   '<=';

它几乎完成了工作并识别了 17>15<=22,并且它在输入 @34 时正确地抱怨 token recognition error

我不明白的是输入34>。没有抱怨,它被匹配为 (expr 34).

为什么最后一个greater-than字符(明显位置不对)没有识别错误?

输入34>不会产生标记识别错误,因为其中有两个预期的标记:NUMBERGT。而且解析器也没有问题,因为规则:

expr    :   compareExpr
        |   NUMBER
        ;

愉快地接受了 NUMBER 令牌,然后停止,留下 GT 令牌。

如果您想强制解析器使用流中的所有标记,您应该使用 built-in EOF 标记 anchor 您的解析器:

expr : (compareExpr | NUMBER) EOF;

之后输入 34> 产生错误。