Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Antlr令牌优先级_Java_Antlr - Fatal编程技术网

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的问题,所以我提交了答案。不过我昨天买了这本书,所以让我消化一会儿。我会将答案保留在这里,并最终将其更新或删除。请您评论一下,您的建议如何通过字母进行标记,以提高性能?看起来要处理的令牌可能比使用模式时多得多。非常感谢。