在Antlr4中lexer规则是否应该明确无误?
假设我想解析日期并定义
hour: DIGIT09 | (DIGIT1 DIGIT09) | (DIGIT2 DIGIT04);
month: DIGIT19 | (DIGIT1 DIGIT02);
DIGIT12: '1'..'2';
DIGIT1: '1';
DIGIT2: '2';
DIGIT19: '1'..'9';
DIGIT09: '0'..'9';
DIGIT04: '0'..'4';
DIGIT04: '0'..'2';
这里我在词法分析器中定义了数字范围。但看起来它不起作用,因为它们含糊不清。
我可以在解析器中定义范围而不是词法分析器吗?
答案 0 :(得分:1)
此类验证最好在创建解析树后执行的侦听器或访问者中执行。从一个数字开始:
NUMBER : [0-9]+;
然后根据以下内容定义hour
和month
:
hour : NUMBER;
month : NUMBER;
获得解析树后,请实施enterHour
和enterMonth
以验证每个中包含的NUMBER
是否有效。
如果用户输入错误的输入,此方法会产生错误恢复和错误报告的最佳组合。