6

我有一个这样的规则定义:

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

谢谢。

4

2 回答 2

6

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

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

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

      freeTextWord : FREE_TEXT_CHARACTER+;
      
  2. FREE_TEXT_WORD令牌移动到在您的输入到达时未启用的模式168:321-331

于 2013-08-24T15:11:30.400 回答
0

FREE_TEXT_WORD目前的形式是捕捉一切。你需要一个非贪婪的词法分析器规则

尝试改变

FREE_TEXT_WORD: NON_SPACE+;

FREE_TEXT_WORD: NON_SPACE+?;.

于 2013-08-22T07:38:13.540 回答