我有这样的规则定义:
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?
谢谢.
ANTLR 将始终使用较长的令牌而不是较短的令牌,因此要纠正这种情况,您必须执行以下操作之一:
使FREE_TEXT_WORDinput的not match 超过 3 个字符168:321-331,例如不允许它包含数字,或者可能完全删除规则。
您也可以更改FREE_TEXT_WORD为FREE_TEXT_CHARACTER. 通过将规则限制为仅匹配单个字符,它永远不会长于另一个标记,因此其优先级将由其在语法中的位置确定。然后,您需要为单词创建解析器规则:
freeTextWord : FREE_TEXT_CHARACTER+;
Run Code Online (Sandbox Code Playgroud)将FREE_TEXT_WORD令牌移动到在您的输入到达时未启用的模式168:321-331。