Java Antlr4:右gammar不匹配
我遇到了一个非常有趣的问题。让我们以它为例 语法1:Java Antlr4:右gammar不匹配,java,antlr,antlr4,Java,Antlr,Antlr4,我遇到了一个非常有趣的问题。让我们以它为例 语法1: TAG_SYMBOL: '@'; tagSymbol: TAG_SYMBOL; TAG_SYMBOL: '@'; TAG: TAG_SYMBOL; tagSymbol: TAG; 语法2: TAG_SYMBOL: '@'; tagSymbol: TAG_SYMBOL; TAG_SYMBOL: '@'; TAG: TAG_SYMBOL; tagSymbol: TAG; 让我们用tagSymbol规则解析“@”文本 语法1: line 1
TAG_SYMBOL: '@';
tagSymbol: TAG_SYMBOL;
TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
tagSymbol: TAG;
语法2:
TAG_SYMBOL: '@';
tagSymbol: TAG_SYMBOL;
TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
tagSymbol: TAG;
让我们用tagSymbol规则解析“@”文本
语法1:
line 1:0 mismatched input '@' expecting '@'.
OK.
语法2:
line 1:0 mismatched input '@' expecting '@'.
OK.
为什么?:) 写作时:
TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
输入@
将始终标记为标记符号
,而不会标记为标记
,即使解析器可能需要标记
。这就是ANTLR的工作原理。匹配最多的lexer规则将获胜,当两个或多个lexer规则匹配相同数量的字符时,最先定义的将获胜
您遇到的错误:
第1行:0不匹配的输入“@”应为“@”
应理解如下:
第1行:0输入文本“@”与类型标记符号不匹配,应为带有类型标记的“@”
如果希望同时具有标记和标记符号,则应使用解析器规则:
parse : tag | tagSymbol;
tag : AT;
tagSymbol : AT;
AT : '@';
编辑
错误消息不可能是正确的。我认为您没有(重新)生成一个新的解析器,因此感到困惑
以下是我的测试结果:
语法1
语法2
测试等级:
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRInputStream("@"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.tagSymbol();
}
}
从语法1生成解析器后运行main类不会产生错误/警告,从语法2生成的解析器会产生以下结果:
第1行:0输入“@”不匹配,需要标记
使用ANTLR 4.5进行测试。如果我理解正确,对于您描述的逻辑,grammar2应该是错误的,但它与grammar1不同,没有问题。@NikitaKoval检查我的编辑,但我有一个“第1行:0输入不匹配'@'预期'@'”错误。@NikitaKoval,那么您使用的ANTLR版本比我的版本多。问题与我解释的一样:永远不会创建TAG
,因为TAG\u符号
是在它前面定义的。