【发布时间】:2016-11-20 23:24:21
【问题描述】:
我正在为实时语言 OpenPEARL 实现一个词法分析器/解析器。为了更好地构建我的测试套件,我想实现一个类似于 C/C++ 的包含文件处理。解析器本身使用访问者。实现这一点的最佳方法是什么?在实例化嵌套解析器时,我关心的一件事是,包含的文件不需要包含完整的程序,具体取决于它的包含位置。
干杯
马塞尔
【问题讨论】:
我正在为实时语言 OpenPEARL 实现一个词法分析器/解析器。为了更好地构建我的测试套件,我想实现一个类似于 C/C++ 的包含文件处理。解析器本身使用访问者。实现这一点的最佳方法是什么?在实例化嵌套解析器时,我关心的一件事是,包含的文件不需要包含完整的程序,具体取决于它的包含位置。
干杯
马塞尔
【问题讨论】:
我不能代表 ANTLR,但一般来说,在词法分析器中实现了一个类似 C 的预处理器。
您可以通过拥有一个堆栈 输入流来实现这一点,堆栈的基础是源文件。您从堆栈顶部的流中读取输入。
当在词法分析器中遇到包含时,一个新的流被压入堆栈顶部,并且继续读取(现在从新流中)。当流遇到 EOF 时,您弹出堆栈并继续;如果堆栈为空,则词法分析器发出 EOF 标记。
您可以滥用这些流来实现宏。在宏调用时,只需推送一个代表宏主体的新流。当您遇到宏参数名称时,为提供给相应宏的参数推送一个流。
【讨论】:
我已经看到在(解析器)语法中完成了包含处理的实现。像 Ira 建议的那样在词法分析器中执行此操作当然是可能的,但需要一些额外的工作。
然而,完整的包含处理不仅仅是切换输入流,即宏处理、线拼接、三元组处理、字符化和字符串化 + 作为 #if(def) 命令的求值器。我在我的Windows Resource File Parser 中实现的所有内容,它是为 ANTLR 2.7 编写的,因此需要更新,但对于获得想法肯定有好处。
在这个项目中,我在正常的 ANTLR 解析链之外处理包含文件,它更多地遵循您在 C/C++ 中经常看到的预处理器方法。
【讨论】: