Antlr4 由于EOF不匹配,ANTLR v4语法无法解析

Antlr4 由于EOF不匹配,ANTLR v4语法无法解析,antlr4,Antlr4,使用ANTLR v4遵循简单语法。此语法在漫游时生成错误消息 **第1行:14输入“”不匹配,需要维度名称* 用于诸如“sdarsfd integer”(不带引号)之类的普通输入 所以提到了f类似的错误,一个bug可能是在4.3的时间范围内提交的。 我一直在使用ANTLR 4.5 有什么帮助/建议/解决方案吗 /** A simple parser for a dimension declaration */ grammar Simple; definition : dim; dim : D

使用ANTLR v4遵循简单语法。此语法在漫游时生成错误消息 **第1行:14输入“”不匹配,需要维度名称*

用于诸如“sdarsfd integer”(不带引号)之类的普通输入

所以提到了f类似的错误,一个bug可能是在4.3的时间范围内提交的。 我一直在使用ANTLR 4.5

有什么帮助/建议/解决方案吗

/**
  A simple parser for a dimension declaration
*/
grammar Simple;
definition : dim;
dim : DimensionName DataType;

DimensionName : LETTER (LETTER)*; // greedy
DataType: 'integer' | 'decimal';
LETTER : [a-zA-Z];
DIGIT : [0-9];

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

您只需切换两个lexer规则
DataType
DimensionName

...
DataType: 'integer' | 'decimal';
DimensionName : LETTER (LETTER)*; // greedy
...
由于
DimensionName
匹配每个字符,“integer”被键入为
DimensionName
而不是
DataType
。对于“sdarsfd integer”,lexer生成两个
DimensionName
标记,因此无法匹配
dim
规则。通过切换两个lexer规则,lexer生成与
dim
规则匹配的
DimensionName
标记和
DataType
标记

此外,您还可以将
字母
数字
定义为片段:

fragment LETTER : [a-zA-Z];
fragment DIGIT : [0-9];
除非您希望将它们作为独立标记进行匹配(在语法中,“a”将被键入为
字母