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 更改为语法中的任何顶级规则。