ANTR error(208): The following token definition can never be matched because prior tokens match the same input:
ANTR error(208): The following token definition can never be matched because prior tokens match the same input:
我是新来的,也是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);
错误消息说明了问题所在:您有特定的词法分析器规则,但它们无法匹配,因为另一个词法分析器规则已经匹配相同的输入。现在还要记住 ANTLR4 匹配这样的规则:
- 匹配最长的规则获胜(贪婪匹配)。
- 如果两个或多个规则匹配相同的输入,则语法中第一个出现的规则获胜。
现在根据此过程检查您的语法,您会注意到您的 VAR
词法分析器规则匹配所有 IF
、ELSE
等匹配的内容。但是由于 VAR
在语法中出现在其他人之前,它总是会赢得 if
等输入。结果现在应该很清楚了:将 "catch all" 规则 VAR
移到你的后面关键字规则(IF
、THEN
等)。
您应该记住的另一件事是,此类关键字永远不会作为 VAR
规则的一部分进行匹配。如果您需要支持(在特殊情况下)关键字作为标识符,请在 SO 中搜索解决方案,因为之前已经讨论过了。
我是新来的,也是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);
错误消息说明了问题所在:您有特定的词法分析器规则,但它们无法匹配,因为另一个词法分析器规则已经匹配相同的输入。现在还要记住 ANTLR4 匹配这样的规则:
- 匹配最长的规则获胜(贪婪匹配)。
- 如果两个或多个规则匹配相同的输入,则语法中第一个出现的规则获胜。
现在根据此过程检查您的语法,您会注意到您的 VAR
词法分析器规则匹配所有 IF
、ELSE
等匹配的内容。但是由于 VAR
在语法中出现在其他人之前,它总是会赢得 if
等输入。结果现在应该很清楚了:将 "catch all" 规则 VAR
移到你的后面关键字规则(IF
、THEN
等)。
您应该记住的另一件事是,此类关键字永远不会作为 VAR
规则的一部分进行匹配。如果您需要支持(在特殊情况下)关键字作为标识符,请在 SO 中搜索解决方案,因为之前已经讨论过了。