语法接受太多
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>
不会产生标记识别错误,因为其中有两个预期的标记:NUMBER
和GT
。而且解析器也没有问题,因为规则:
expr : compareExpr
| NUMBER
;
愉快地接受了 NUMBER
令牌,然后停止,留下 GT
令牌。
如果您想强制解析器使用流中的所有标记,您应该使用 built-in EOF
标记 anchor 您的解析器:
expr : (compareExpr | NUMBER) EOF;
之后输入 34>
将 产生错误。
我是 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>
不会产生标记识别错误,因为其中有两个预期的标记:NUMBER
和GT
。而且解析器也没有问题,因为规则:
expr : compareExpr
| NUMBER
;
愉快地接受了 NUMBER
令牌,然后停止,留下 GT
令牌。
如果您想强制解析器使用流中的所有标记,您应该使用 built-in EOF
标记 anchor 您的解析器:
expr : (compareExpr | NUMBER) EOF;
之后输入 34>
将 产生错误。