如何判断 ANTLR4 解析器是否消耗了 TokenStream 的所有标记?

How to tell if ANTLR4 parser consumed all tokens of the TokenStream?

我有以下 ANTLR4 语法定义。请注意,规则 "query" 以可选子规则 "orderLimit":

结尾
query: 'IDX.SELECT' indexName orderLimit?;
indexName: IDENTIFIER;
orderLimit: 'ORDERBY' order ('LIMIT' limit)?;
order: property;
property: IDENTIFIER;
limit: INT;
INT: '0' | [1-9] [0-9]*;
IDENTIFIER: [a-zA-Z_]([a-zA-Z0-9_])*;

生成的解析器接受输入文本 "IDX.SELECT orders LIMIT 30" 没有任何错误,标记 "LIMIT 30" 被静默忽略。

但是我想检测并报告此类信息,以便用户可以将他们的输入修改为绝对正确的。

使用内置 EOF 令牌锚定 query 规则:

query: 'IDX.SELECT' indexName orderLimit? EOF;

强制解析器使用整个令牌流。