我有这样的规则定义:
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 ?
感谢。
答案 0 :(得分:4)
ANTLR将始终在较短的令牌上使用较长的令牌,因此要纠正这种情况,您必须执行以下操作之一:
使输入FREE_TEXT_WORD
的{{1}}不匹配超过3个字符,例如不允许它包含数字,或者可能完全删除规则。
您也可以将168:321-331
更改为FREE_TEXT_WORD
。通过将规则限制为仅匹配单个字符,它将永远不会长于另一个标记,因此其优先级将由其在语法中的位置确定。然后,您需要为单词创建解析器规则:
FREE_TEXT_CHARACTER
将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+?;
。