如何解决期望“LEXER_RULE”的不匹配输入“令牌”

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

我在 ANTLR4 (g4) 中定义了以下语法:

grammar SimpleExpr2;

expr: entityName '(' paramList ')' SEMICOLON;

entityName: ENTITY_NAME;

paramList: param (SEPARATOR param)*;

param: PARAM_NAME ':' DATA_TYPE
     | PARAM_NAME;

ENTITY_NAME: [a-zA-Z_][a-zA-Z0-9_]*;

PARAM_NAME: [a-zA-Z_][a-zA-Z0-9_]*;

DATA_TYPE: 'int'
         | 'string'
         | 'float'
         | 'date'
         | 'text'
         ;

SEPARATOR: ',';

SEMICOLON: ';';

WS: [ \t\n\r]+ -> skip;

使用以下输入

entity( parametros:int, parametro:int, paramtrico:float, paramtri);

显然它有效,但结果显示以下错误:

line 1:4 mismatched input 'parametros' expecting PARAM_NAME

line 1:20 mismatched input 'parametro' expecting PARAM_NAME

line 1:35 mismatched input 'paramtrico' expecting PARAM_NAME

line 1:53 mismatched input 'paramtri' expecting PARAM_NAME

结果树显示这些标记上的红色

enter image description here

如何解决这个问题?

语法最初在规则定义中具有不同的顺序,已重新排序以尝试解决它。例如,最初同样的错误出现在 ENTITY_NAME 中,但现在出现在参数中。

regex compiler-construction antlr4 grammar
1个回答
0
投票

这样做:

param
 : param_name ':' DATA_TYPE
 | param_name
 ;

entity_name : ID;
param_name : ID;

DATA_TYPE
 : 'int'
 | 'string'
 | 'float'
 | 'date'
 | 'text'
 ;

ID : [a-zA-Z_][a-zA-Z0-9_]*;

另请注意,

DATA_TYPE
必须位于
ID
之前。

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