0

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

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

grammar clock;
clock: HOUR ':' MINUTE

HOUR: '2'[0-3]|'1'[0-9]|[0-9];

MINUTE: [0-5][0-9]

我们的代码无法识别“HOUR”部分,它可以识别分钟。我什至将 HOUR 更改为与分钟相同的值,但它仍然无法识别 HOUR。为了检查我们的正则表达式是否错误,我们甚至交换了 HOUR 和 MINUTE 的顺序,并做了 MINUTE:HOUR,它识别的是小时,但不是分钟。有什么我想念的吗?它永远不会解析 HOUR,但总是 MINUTE,这是怎么回事?

4

1 回答 1

2

ANTLR 词法分析器在使用解析器之前完全分配明确的标记类型。当多个标记类型可以匹配一个标记时,语法中出现的第一个就是使用的那个。对于您的语法,标记不能同时具有类型HOUR和类型MINUTE。由于输入12匹配这两个词法分析器规则,因此使用语法中出现的第一个,因此12始终是 anHOUR并且永远不会是 a MINUTE

通常,词法分析器会产生类似于以下规则的整数:

INT : [0-9]+;

那么解析器规则clock可能如下所示:

clock : INT ':' INT;

由于您使用的是 ANTLR 4,因此您可以扩展生成的类ClockBaseListener并覆盖该enterClock方法以执行额外的验证(具体来说,验证第一个INT满足小时要求,第二个INT满足分钟要求。

于 2013-06-02T22:06:13.897 回答