ANTLR4只能解析一条class语句,不能解析整个文件
ANTLR4 can only parse a class statement, not the whole file
我创建了一个简单的代码来解析 PHP 文件:
<?php
namespace aaa;
class Xyz {
}
我使用 ANTL4 和这个语法编写了一个解析器:https://github.com/antlr/grammars-v4/tree/master/php:
PhpLexer lexer = new PhpLexer(new ANTLRInputStream((new BufferedReader(new FileReader("./code/test.php")))));
CommonTokenStream tokens = new CommonTokenStream(lexer);
PhpParser parser = new PhpParser(tokens);
PhpParserBaseListener listener = new PhpParserBaseListener();
parser.addParseListener(listener);
parser.classDeclaration().enterRule(listener);
parser.getSerializedATN();
它returns一个错误:
line 3:0 mismatched input 'namespace' expecting {'abstract', 'class', 'final', 'interface', 'partial', 'private', 'trait'}
但是当我删除 "namespace aaa;" 语句时:
<?php
class Xyz {
}
一切都很好。
如何解决?
由于您没有显示任何语法,因此无法提供具体答案。此外,我真的对 Antlr 的 PHP 运行时知之甚少,无法猜测它的作用:
parser.classDeclaration().enterRule(listener);
但一般来说,Antlr4 会为每个非终端规则创建一个接口,所以我假设 parser.classDeclaration()
对应于 classDeclaration
规则,大概代表了一个 class 声明,并且不是整个程序。也许您应该将 classDeclaration
更改为语法中的任何顶级规则。
我创建了一个简单的代码来解析 PHP 文件:
<?php
namespace aaa;
class Xyz {
}
我使用 ANTL4 和这个语法编写了一个解析器:https://github.com/antlr/grammars-v4/tree/master/php:
PhpLexer lexer = new PhpLexer(new ANTLRInputStream((new BufferedReader(new FileReader("./code/test.php")))));
CommonTokenStream tokens = new CommonTokenStream(lexer);
PhpParser parser = new PhpParser(tokens);
PhpParserBaseListener listener = new PhpParserBaseListener();
parser.addParseListener(listener);
parser.classDeclaration().enterRule(listener);
parser.getSerializedATN();
它returns一个错误:
line 3:0 mismatched input 'namespace' expecting {'abstract', 'class', 'final', 'interface', 'partial', 'private', 'trait'}
但是当我删除 "namespace aaa;" 语句时:
<?php
class Xyz {
}
一切都很好。
如何解决?
由于您没有显示任何语法,因此无法提供具体答案。此外,我真的对 Antlr 的 PHP 运行时知之甚少,无法猜测它的作用:
parser.classDeclaration().enterRule(listener);
但一般来说,Antlr4 会为每个非终端规则创建一个接口,所以我假设 parser.classDeclaration()
对应于 classDeclaration
规则,大概代表了一个 class 声明,并且不是整个程序。也许您应该将 classDeclaration
更改为语法中的任何顶级规则。