用Antlr制作时钟

用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] 我们的代码无法识别“小时”部分,它识别分钟。我甚至将小时更改为与分钟相同的值,但它仍然无法识别小时。为了检查我们的正则表达式是否错误,我们甚至按顺序交换了小时和分钟,并执行了分钟:小时,它识别小时,但不

我正在Antlr中创建一个名为time的数据类型,它将返回一个小时:分钟形式的时钟

到目前为止,我的代码是这样的:

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
满足分钟要求)