如何使用ANTLR4解析嵌套的源文件?

时间:2019-06-02 10:58:35

标签: antlr4

我之前曾问过这个问题(略有不同),但当时对答案的理解不够,无法给出明智的反馈(叹气)。

我需要能够在任意位置将文件包含在其他文件中,因此我需要能够使用一棵解析树来容纳一堆文件。

如果我自己编写此代码(并且我以前已经这样做过),则我的解析器将识别出“ Include xyz”或“ Import abc”,并会导致词法分析器暂停从当前文件读取数据,将其推入文件放在堆栈上,然后继续从新文件读取字符,直到用尽为止。

但是,当使用 ANTLR4 (到目前为止,我避免在语法文件本身中插入任何代码)并使用访问者模式时,我看到的只是创建的树,当然这也是迟到。

我发现可以在词法分析器中完成对PUSHSTREAM的引用,但是我找不到实际的示例,并且会非常感谢一些帮助(或者是指向我在搜索时可能会错过的实际示例的指针,也可能是简短的代码样本中是否有人拥有)。

请注意,我是用C ++而不是Java编写代码。

预先感谢

1 个答案:

答案 0 :(得分:0)

几年前,我为ANTLR 2.7开发了一个parse Windows resource files(* .rc)解决方案。这些文件的结构非常类似于C / C ++头文件,并支持预处理程序指令,例如#if /#end /#pragma /#include。

为此,我创建了一个特殊的字符输入流(带有嵌套的char输入流),该流实现了包含文件的基于堆栈的方法。每当在char输入中找到新的include伪指令时,就会使用当前的实际输入流,其位置和行/列信息(以在发现解析问题的情况下提供本地源位置)创建新的堆栈条目。将该条目压入堆栈,并创建一个新的输入流。一旦用尽,TOS就会从堆栈中弹出,并且从最后位置(在#include语句之后)继续提供服务字符。该词法分析器只能看到连续的字符流。