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

问题描述 投票:0回答:1

我是新来的,在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);
antlr
1个回答
1
投票

错误消息说明了问题所在:您有某些词法分析器规则,因此无法匹配,因为另一个词法分析器规则已经与相同的输入匹配。现在还要记住,ANTLR4匹配如下规则:

  1. 匹配时间最长的规则获胜(贪婪匹配)。
  2. 如果两个或多个规则匹配相同的输入,则语法中第一个出现的规则将获胜。

现在对照此过程检查语法,您会发现VAR词法分析器规则与所有IFELSE等匹配的规则匹配。但是,由于VAR出现在语法中的其他词之前,因此它总是会赢得if等输入。现在应该清楚了:将“全部捕获”规则VAR移到关键字规则(IFTHEN等。)>

[您应该记住的另一件事是,此类关键字永远不会作为VAR规则的一部分进行匹配。如果您需要支持(在特殊情况下)关键字作为标识符,则可以在SO中搜索解决方案,因为这已经在前面进行了讨论。

© www.soinside.com 2019 - 2024. All rights reserved.