首页 > 解决方案 > 如何使用 ANTLR4 解析嵌套的源文件?

问题描述

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

我需要能够在任意点将文件包含在其他文件中,因此我需要能够拥有一堆带有单个解析树的文件。

如果我自己写这个(并且我过去做过),我的解析器会识别“包含 xyz”或“导入 abc”,并会导致词法分析器暂停从当前文件读取,将该文件推送到堆栈,并继续从新文件中读取字符,直到用尽。

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

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

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

提前致谢

标签: antlr4

解决方案


几年前,我为 ANTLR 2.7 开发了一个解决方案,用于解析 Windows 资源文件(*.rc)。此类文件的结构与 C/C++ 头文件非常相似,并支持 #if/#end/#pragma/#include 等预处理器指令。

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


推荐阅读