Antlr4:输入不匹配

Antlr4:输入不匹配,antlr4,Antlr4,这里有一个简单的语法测试,我认为它很容易解析,但我一下子就得到了“不匹配的输入”,我不知道Antlr在寻找什么 输入: # include "something" program TEST1 { BLAH BLAH } 我的语法: grammar ProgHeader; program: header* prog EOF ; header: '#' ( include | define ) ; include: 'include' string ; define: '

这里有一个简单的语法测试,我认为它很容易解析,但我一下子就得到了“不匹配的输入”,我不知道Antlr在寻找什么

输入:

  # include "something" program TEST1 { BLAH BLAH }
我的语法:

  grammar ProgHeader;

  program: header* prog EOF ;
  header: '#' ( include | define ) ;
  include: 'include' string ;
  define: 'define' string string? ;
  string: '"' QTEXT '"' ;
  prog: 'program' QTEXT '{' BLOCK '}' ;
  QTEXT: ~[\r\n\"]+ ;
  BLOCK: ~[}]+ ; // don't care, example block
  WS: [ \t\r\n] -> skip ;
输出错误消息:

line 1:0 mismatched input '# include "something" program TEST1 { BLAH BLAH '
expecting {'program', '#'}
这真的让我很困惑,因为它说它在寻找一个“#”,而在输入的开头有一个。我也甩了解析树。根据“程序”规则,它似乎卡在顶部:

(program # include "something" program TEST1 { BLAH BLAH  } )
哈尔普

下面是驱动这个测试用例的完整程序(我认为这不重要,上面的信息已经足够了,但在这里):

以及全部输出:

run:
line 1:0 mismatched input '# include "something" program TEST1 { BLAH BLAH ' expecting {'program', '#'}
'# include "something" program TEST1 { BLAH BLAH } ': (program # include "something" program TEST1 { BLAH BLAH  } )
BUILD SUCCESSFUL (total time: 0 seconds)

在最开始处匹配的最长标记是QTEXT,它匹配文本
#include
(直到但不包括第一个
字符的文本),但在这一点上,有效的标记是“program”和“#”。因此,最好避免与几乎任何东西都匹配的标记定义。

我想我不明白。你是说所有的lexer规则都是活动的吗?这似乎非常奇怪,甚至是错误的。这可能是真的,但似乎限制了Antlr的用途。我阅读它的方式顶层活动的规则(不是标记)是“#”和“program”。我将把这个问题留到其他人加入之前。@user2338547在ANTLR 4中,一次激活一个lexer模式,该模式规则中最长的非
片段
lexer规则将确定创建了哪个标记。语法仅包括一个模式(默认模式),所以是的,所有lexer规则将立即激活。好的,我需要考虑这个。“最长的非片段lexer规则”…最长由什么决定?什么规则产生最长的标记(文本字符串)?来自Antlr的一条有用消息是指出QTEXT lexer规则已匹配,而不是两个预期规则:header和prog。
run:
line 1:0 mismatched input '# include "something" program TEST1 { BLAH BLAH ' expecting {'program', '#'}
'# include "something" program TEST1 { BLAH BLAH } ': (program # include "something" program TEST1 { BLAH BLAH  } )
BUILD SUCCESSFUL (total time: 0 seconds)