antlr4 - 如何使用 ANTLR4 解析嵌套的源文件?
问题描述
我以前曾问过这个问题(略有不同),但当时对答案的理解还不够,无法给出明智的反馈(叹息)。
我需要能够在任意点将文件包含在其他文件中,因此我需要能够拥有一堆带有单个解析树的文件。
如果我自己写这个(并且我过去做过),我的解析器会识别“包含 xyz”或“导入 abc”,并会导致词法分析器暂停从当前文件读取,将该文件推送到堆栈,并继续从新文件中读取字符,直到用尽。
但是,当使用ANTLR4(到目前为止,我避免将任何代码插入语法文件本身)并使用访问者模式时,我看到的只是创建的树,这当然为时已晚。
我发现对 PUSHSTREAM 的引用可以在词法分析器中完成,但我找不到实际示例,非常感谢一些帮助(指向我在搜索时可能错过的实际示例的指针或简短的代码示例,如果有人有一个)。
请注意,我正在用 C++ 编写代码,而不是 Java。
提前致谢
解决方案
几年前,我为 ANTLR 2.7 开发了一个解决方案,用于解析 Windows 资源文件(*.rc)。此类文件的结构与 C/C++ 头文件非常相似,并支持 #if/#end/#pragma/#include 等预处理器指令。
为此,我创建了一个特殊的字符输入流(带有嵌套的字符输入流),它为包含文件实现了基于堆栈的方法。每当在 char 输入中找到新的 include 指令时,都会使用当前实际输入流、其位置和行/列信息创建新的堆栈条目(以提供本地源位置,以防发现解析问题)。该条目被压入堆栈并创建新的输入流。一旦用完,TOS 就会从堆栈中弹出,并从最后一个位置继续提供字符(在 #include 语句之后)。词法分析器只能看到连续的字符流。
推荐阅读
- jsp - 为什么 JSP 在刷新时会在客户端重复记录?
- swift - SwiftUI UIRepresentable tableView 单元格截断
- ios - 根据另一个 NSbutton 以编程方式设置 NSButton 属性
- node.js - 异步/等待函数返回未定义
- oracle-apex - 如何抑制由更改其级联父列的值引起的交互式网格弹出 lov 列的更改事件?
- azure-devops - 无需代码签出即可创建 Azure Devops 管道
- qt - 如何在qt qml中更改地图上代表组件的颜色
- node.js - 如何使 MongoDB 更新执行得更快?
- reactjs - 在本机反应中动态呈现问题
- java - 可变 Spring Bean 中的线程安全