Antlr4 由于EOF不匹配,ANTLR v4语法无法解析
使用ANTLR v4遵循简单语法。此语法在漫游时生成错误消息 **第1行:14输入“”不匹配,需要维度名称* 用于诸如“sdarsfd integer”(不带引号)之类的普通输入 所以提到了f类似的错误,一个bug可能是在4.3的时间范围内提交的。 我一直在使用ANTLR 4.5 有什么帮助/建议/解决方案吗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
/**
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”将被键入为字母
)