Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Antlr4:右gammar不匹配_Java_Antlr_Antlr4 - Fatal编程技术网

Java Antlr4:右gammar不匹配

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

我遇到了一个非常有趣的问题。让我们以它为例

语法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符号
是在它前面定义的。