Antlr ANTR错误(208):以下令牌定义永远无法匹配,因为先前的令牌匹配相同的输入:

Antlr ANTR错误(208):以下令牌定义永远无法匹配,因为先前的令牌匹配相同的输入:,antlr,Antlr,我是新来的,在ANTLR也是新来的。我很长一段时间都在犯这个错误,我找不到原因。请帮帮我 错误(208):MPL.g:16:1:无法匹配以下令牌定义,因为先前的令牌与相同的输入匹配:CHAR、IF、ELSIF、ELSE、THEN、PRINT grammar mpl; INT : ('0'..'9')+; FLOAT: ('0'..'9')+ '.' ('0'..'9')*; INTEGER : 'int'; FLOT : 'float'; CHARAC : '

我是新来的,在ANTLR也是新来的。我很长一段时间都在犯这个错误,我找不到原因。请帮帮我

错误(208):MPL.g:16:1:无法匹配以下令牌定义,因为先前的令牌与相同的输入匹配:CHAR、IF、ELSIF、ELSE、THEN、PRINT

    grammar mpl;
INT :   ('0'..'9')+;
FLOAT:   ('0'..'9')+ '.' ('0'..'9')*;
INTEGER :   'int';
FLOT    :   'float';
CHARAC  :   'char';
BEGIN   :   'begin';
END :   'end';
VAR :   ('a'..'z'|'A'..'Z')+('0'..'9')*;
CHAR    :       ('a'..'z'|'A'..'Z')+;
IF  :   'if';
ELSIF   :   'elsif';
ELSE    :   'else';
ENDIF   :   'end if';
THEN    :   'then';
PRINT   :       'print';
SEMICOLON:  ';';
COLONS  :   ':';
OPERATOR: ('+'|'-'|'*'|'/');
RELATIONAL: ('=='|'<'|'>'|'>='|'<='|'!=');
ASSIGN: '=';

program :   BEGIN decleration* statement* END;
decleration :   int|float|char;
int :   INTEGER COLONS (VAR(ASSIGN INT)?)+ SEMICOLON;
float   :   FLOT COLONS (VAR(ASSIGN FLOAT)?)+ SEMICOLON;
char    :   CHARAC COLONS (VAR(ASSIGN CHAR)?)+ SEMICOLON;

statement : ifstatement|assign|print;
statement2:  assign|print;
condition
    :   identifier RELATIONAL identifier THEN;
ifstatement:    IF condition
    statement2*
    (ELSIF condition statement2*)* (ELSE statement2*)? ENDIF SEMICOLON;      
identifier: VAR|INT|FLOAT|CHAR;
print   :   PRINT identifier SEMICOLON;
assign  :   VAR ASSIGN equation;
equation:   (VAR|INT|FLOAT|CHAR)| (VAR|INT|FLOAT|CHAR) OPERATOR (VAR|INT|FLOAT|CHAR);
语法mpl;
INT:('0'..'9')+;
浮动:('0'..'9')+'。('0'..'9')*;
整数:“int”;
弗洛特:“浮动”;
CHARAC:‘char’;
开始:“开始”;
结束:"结束";;
变量:('a'..'z'|'a'..'z')+('0'..'9')*;
字符:('a'..'z'|'a'..'z')+;
如果:‘如果’;
埃尔西夫:“埃尔西夫”;
ELSE:‘ELSE’;
ENDIF:'如果结束';
然后:"然后",;
打印:“打印”;
分号:';';
冒号:':';
运算符:(“+”|“-“|”*“|”/”);

关系:('='|''.'>='|'错误消息说明问题所在:您有某些lexer规则,但无法匹配,因为另一个lexer规则已匹配相同的输入。现在还请记住,ANTLR4匹配如下规则:

  • 匹配时间最长的规则获胜(贪婪匹配)
  • 如果两个或多个规则匹配相同的输入,那么首先出现在语法中的规则获胜
  • 现在对照这个过程检查语法,您会注意到您的
    VAR
    lexer规则匹配所有
    IF
    ELSE
    等匹配项。但是由于
    VAR
    在语法中出现在其他项之前,因此对于
    IF
    等输入,它将始终获胜。现在应该清楚了:移动关键字规则后面的“一网打尽”规则
    VAR
    IF
    THEN
    等)


    另一件你应该记住的事情是,这些关键字永远不会作为你的
    VAR
    规则的一部分进行匹配关键字作为标识符,然后在SO中搜索解决方案,这在前面已经讨论过了。

    好的,非常感谢,我以前也看过堆栈溢出,但我不明白问题是什么,但现在,我想我更明白了:)很高兴我能帮忙。请点击左边的复选标记接受我的答案。如果你认为值得,你甚至可以投票。