ANTLR解析多个文件以生成一个AST

ANTLR解析多个文件以生成一个AST,antlr,Antlr,如何解析多个源文件,并最终只使用一个AST来执行分析和代码生成?通常,我发现ANTLR的示例用法是 public void process(String source) { ANTLRStringStream Input = new ANTLRStringStream(input); TLexer lex = new TLexer(Input); CommonTokenStream tokens = new CommonTokenStream(lex); TPa

如何解析多个源文件,并最终只使用一个AST来执行分析和代码生成?通常,我发现ANTLR的示例用法是

public void process(String source) 
{
    ANTLRStringStream Input = new ANTLRStringStream(input);
    TLexer lex = new TLexer(Input);
    CommonTokenStream tokens = new CommonTokenStream(lex);
    TParser parser = new TParser(tokens);
    var tree = parser.parse().Tree; 
} 

但是lexer和解析器似乎都无法获取额外的文件。我是否应该创建一个lexer和parser pr.inputfile并使用tree.Add()将其他文件中的树添加到第一个文件的树中?

我认为这与您所追求的非常接近。我已经硬编码了两个要处理的文件,但是您可以通过创建循环来处理任意数量的文件。在步骤
//创建新的父节点并将此处的树合并到fulltree中
请参见Bart的答案。它有创建父节点和附加子节点的步骤(抱歉,我没有这样做,没有时间集成他的代码和测试)

公共类OneAstFromTwo文件{
公共字符串source1=“file1.txt”;
公共字符串source2=“file2.txt”;
公共静态void main(字符串[]args)
普通树;
{
CommonTree节点1=进程(source1);
CommonTree节点2=进程(source2);
//创建新的父节点并将此处的树合并到fulltree中
CommonTreeNodesTeam节点=新建CommonTreeNodesTeam(fulltree);//创建节点流
treeEval walker=新treeEval(fulltree);
walker.startRule();//在组合树上行走
}
公共CommonTree进程(字符串源)
{
CharStream afs=null;
//读取文件;如果出现错误,请退出
试试{
afs=新的ANTLRFileStream(源);
}
捕获(IOE异常){
System.out.println(“未找到文件”);
系统出口(1);
}
TLexer lex=新的TLexer(afs);
CommonTokenStream令牌=新的CommonTokenStream(lex);
TParser parser=新的TParser(令牌);
//注意startRule是解析器语法中第一条规则的名称
TParser.startRule_return r=parser.startRule();//解析此文件
CommonTree ast=(CommonTree)r.getTree();//通过分析此文件创建ast
return ast;//并返回它
}
}

以下是三种方法:

  • 根据巴特的建议,将文件合并到一个缓冲区中。这将需要添加一个LoCer-R规则,该规则对C++的行指令实现相同的功能。
  • 合并解析器规则返回的树

  • 使用多个输入流和一个lexer。这可以通过使用类似于在词法分析之前将所有缓冲区推到堆栈上进行处理的代码来实现


  • 第二种选择可能是最简单的。我不使用Java目标,因此无法提供所有这些解决方案所需的代码详细信息。

    如何将所有文件读入一个字符串,并解析该字符串?唉,我无法返回带有文件名和行号的合理错误消息。