Antlr令牌优先级

时间:2013-08-21 15:00:35

标签: java antlr

我有这样的规则定义:

reference: volume':'first_page'-'last_page ;

volume: INTEGER;
first_page: INTEGER;
last_page: INTEGER;

INTEGER: [0-9]+;

FREE_TEXT_WORD: NON_SPACE+;

fragment NON_SPACE : ~[ \r\n\t];

鉴于输入“ 168:321-331 ”,我认为它符合参考规则。但实际上,整个字符串被标记为 FREE_TEXT_WORD

在这种情况下,如何让 INTEGER 令牌优先于 FREE_TEXT_WORD

感谢。

2 个答案:

答案 0 :(得分:4)

ANTLR将始终在较短的令牌上使用较长的令牌,因此要纠正这种情况,您必须执行以下操作之一:

  1. 使输入FREE_TEXT_WORD的{​​{1}}不匹配超过3个字符,例如不允许它包含数字,或者可能完全删除规则。

    • 您也可以将168:321-331更改为FREE_TEXT_WORD。通过将规则限制为仅匹配单个字符,它将永远不会长于另一个标记,因此其优先级将由其在语法中的位置确定。然后,您需要为单词创建解析器规则:

      FREE_TEXT_CHARACTER
  2. freeTextWord : FREE_TEXT_CHARACTER+; 标记移动到输入到达FREE_TEXT_WORD时未启用的模式。

答案 1 :(得分:0)

当前形式的

FREE_TEXT_WORD正在捕捉一切。您需要non greedy lexer rule

尝试更改

FREE_TEXT_WORD: NON_SPACE+;

FREE_TEXT_WORD: NON_SPACE+?;