如何判断ANTLR4解析器是否消耗TokenStream的所有令牌?

问题描述:

我有以下ANTLR4语法定义。要注意规则“查询”可选子规则“orderLimit”结尾:如何判断ANTLR4解析器是否消耗TokenStream的所有令牌?

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订单LIMIT 30”没有任何错误,与令牌“LIMIT 30”忽略。

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

query规则与内置EOF令牌:

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

迫使解析器消耗整个令牌流。