用Antlr制作时钟
我正在Antlr中创建一个名为time的数据类型,它将返回一个小时:分钟形式的时钟 到目前为止,我的代码是这样的:用Antlr制作时钟,antlr,antlr4,Antlr,Antlr4,我正在Antlr中创建一个名为time的数据类型,它将返回一个小时:分钟形式的时钟 到目前为止,我的代码是这样的: grammar clock; clock: HOUR ':' MINUTE HOUR: '2'[0-3]|'1'[0-9]|[0-9]; MINUTE: [0-5][0-9] 我们的代码无法识别“小时”部分,它识别分钟。我甚至将小时更改为与分钟相同的值,但它仍然无法识别小时。为了检查我们的正则表达式是否错误,我们甚至按顺序交换了小时和分钟,并执行了分钟:小时,它识别小时,但不
grammar clock;
clock: HOUR ':' MINUTE
HOUR: '2'[0-3]|'1'[0-9]|[0-9];
MINUTE: [0-5][0-9]
我们的代码无法识别“小时”部分,它识别分钟。我甚至将小时更改为与分钟相同的值,但它仍然无法识别小时。为了检查我们的正则表达式是否错误,我们甚至按顺序交换了小时和分钟,并执行了分钟:小时,它识别小时,但不识别分钟。有什么我遗漏的吗?发生了什么事情,它永远不会解析小时,而总是分钟?ANTLR词法分析器在使用解析器之前完全分配明确的令牌类型。当多个标记类型可以匹配一个标记时,语法中出现的第一个标记类型就是所使用的标记类型。对于语法,标记不能同时具有类型
HOUR
和类型MINUTE
。由于输入的12
与这两个词法规则都匹配,因此使用语法中第一个出现的12
将始终是HOUR
,而不是MINUTE
通常,lexer生成与以下规则类似的整数:
INT : [0-9]+;
然后,clock
的解析器规则可能如下所示:
clock : INT ':' INT;
由于您使用的是ANTLR 4,因此可以扩展生成的类ClockBaseListener
,并重写enterClock
方法以执行附加验证(具体地说,验证第一个INT
满足小时要求,第二个INT
满足分钟要求)