如何判断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;
迫使解析器消耗整个令牌流。