【问题标题】:ANTR error(208): The following token definition can never be matched because prior tokens match the same input:ANTR 错误(208):永远无法匹配以下标记定义,因为先前的标记匹配相同的输入:
【发布时间】:2020-03-28 18:46:45
【问题描述】:

我是新来的,我也是 ANTLR 的新人。我收到这个错误很长时间了,我找不到它的原因。请帮帮我!!

error(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】:

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

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

    现在对照这个过程检查你的语法,你会注意到你的 VAR 词法分析器规则匹配所有 IFELSE 等匹配的内容。但是由于VAR在语法中出现在其他语法之前,它总是会赢得if等输入。结果现在应该清楚了:将“catch all”规则VAR移到关键字规则后面(IFTHEN 等)。

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

    【讨论】:

    • 好的,非常感谢,我之前也看过堆栈溢出,但我不明白问题是什么,但现在,我想我明白了:)
    • 很高兴我能帮上忙。请点击左侧的复选标记接受我的回答。如果您认为值得,您甚至可以投票。
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多