Antlr 为什么这个语法是错误的?

Antlr 为什么这个语法是错误的?,antlr,antlr3,Antlr,Antlr3,我不明白为什么下面的语法会导致错误,因为它将永远不会匹配: error(208): test.g:11:1: The following token definitions can never be matched because prior tokens match the same input: IF ANTLRWorks 1.4.3 ANTLT 3.4 grammar test; @lexer::members { private boolean rawAhead() { }

我不明白为什么下面的语法会导致错误,因为它将永远不会匹配:

error(208): test.g:11:1: The following token definitions can never be matched because prior tokens match the same input: IF
ANTLRWorks 1.4.3

ANTLT 3.4

grammar test;

@lexer::members {
  private boolean rawAhead() {
  }
}

parse    :    IF*;

RAW    :    ({rawAhead()}?=> . )+;
IF      :    'if';
ID    :    ('A'..'Z'|'a'..'z')+;
删除原始规则或ID规则解决错误。。。 在我看来,如果rawhead()返回false,IF确实有可能匹配

Bood写道:

我认为这实际上很重要,比如说,如果我们在mmode之外有一个“如果”,比如说,如果,那么这里的“如果”将与“如果”匹配,而不是原始的(相同的长度,匹配第一个),对吗

是的,你说得对,说得好。再多考虑一下,这是阿飞的预期行为。但是,事情似乎有点不同:
RAW
规则优先于
ID
IF
规则,即使放在lexer语法的末尾,如您所见:

freemarker_simple.g
语法自由标记\u简单;
@lexer::成员{
私有布尔mmode=false;
私有布尔值{
如果(mmode)返回false;
int ch1=input.LA(1),ch2=input.LA(2),ch3=input.LA(3);
回来(

(ch1=='那些想回答的人,也贴在这里:是的,我也很想知道。但是在你的情况下,最后保持
原始
没有什么坏处,不是吗?@bart,是的,邮件列表中又是我:)是的,我猜得很对。我贴了一个链接,以防你在那里得到回答。有趣的是,当你把
{true}?=>
'if'
前面,没有产生错误…:|。可能是一个错误(ANTLR v3.2和v3.1都产生相同的错误)。@bart,我认为这实际上很重要,比如说如果我们在mmode之外有一个且只有一个“if”,例如if,那么这里的if将与if匹配,而不是原始的(相同的长度,匹配第一个),对吗?我自己做了测试,似乎你是对的……现在完全对规则的优先级感到困惑:(@Bood,是的,我也是!在ANTLR列表上发布了一个关于这个的问题:让我们看看真正的专家是怎么说的!)
<#/if>if<#if>foo<#if>
      ^^     ^^^