我在 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
结果树显示这些标记上的红色
如何解决这个问题?
语法最初在规则定义中具有不同的顺序,已重新排序以尝试解决它。例如,最初同样的错误出现在 ENTITY_NAME 中,但现在出现在参数中。
这样做:
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
之前。