Java Antlr令牌优先级
我有这样一个规则定义:Java Antlr令牌优先级,java,antlr,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”,我认为它将匹配引用规则。但实际上,整个字符串被标记为一个免费的\u
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”,我认为它将匹配引用规则。但实际上,整个字符串被标记为一个免费的\u文本\u单词
在这种情况下,我如何使整数标记优先于自由文字
谢谢。
FREE\u TEXT\u当前形式的WORD
正在捕获所有内容。你需要一份工作
试着改变
FREE_TEXT_WORD:非空间+代码>
到
FREE_TEXT_WORD:NON_SPACE+代码>ANTLR总是使用较长的令牌而不是较短的令牌,因此要纠正这种情况,必须执行以下操作之一:
使FREE\u TEXT\u WORD
与输入的168:321-331
不匹配超过3个字符,例如,不允许其包含数字,或可能完全删除规则
- 您还可以将
FREE\u TEXT\u WORD
更改为FREE\u TEXT\u CHARACTER
。通过将规则限制为仅匹配单个字符,它将永远不会超过另一个标记,因此其优先级将由其在语法中的位置决定。然后需要为单词创建解析器规则:
freeTextWord : FREE_TEXT_CHARACTER+;
将FREE\u TEXT\u WORD
标记移动到一个模式,该模式在您的输入达到168:321-331
时未启用
-1:这不像它看起来做的那样。实际上,您所做的是将规则转换为FREE_TEXT_WORD:NON_SPACE
,它通过强制自由文本\u单词
规则不匹配多个字符,允许整数
规则匹配输入。@280Z28谢谢您的评论。我真的觉得这是一个贪婪的问题,我的快速测试解决了OP的问题,所以我提交了答案。不过我昨天买了这本书,所以让我消化一会儿。我会将答案保留在这里,并最终将其更新或删除。请您评论一下,您的建议如何通过字母进行标记,以提高性能?看起来要处理的令牌可能比使用模式时多得多。非常感谢。