Antlr令牌优先级

Wud*_*ong 5 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];
Run Code Online (Sandbox Code Playgroud)

鉴于输入" 168:321-331 ",我认为它将与参考规则相匹配.但实际上,整个字符串被标记为FREE_TEXT_WORD.

在这种情况下,如何使INTEGER标记优先于FREE_TEXT_WORD

谢谢.

Sam*_*ell 6

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

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

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

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