ANTLR4:实现C(如include)文件处理的最佳方法是什么?

ANTLR4:实现C(如include)文件处理的最佳方法是什么?,antlr,antlr4,Antlr,Antlr4,我正在为实时语言OpenPEARL实现一个lexer/解析器。为了更好地构造我的测试套件,我想实现一个与C/C++类似的include文件处理。解析器使用访问者。实现这一点的最佳方法是什么?在实例化嵌套解析器时,我关心的一件事是,所包含的文件不需要包含完整的程序,这取决于它包含的位置 干杯 Marcel我不能代表ANTLR,但一般来说,在lexer中实现了一个类似C的预处理器 您可以通过拥有一个输入流堆栈来实现这一点,堆栈的基础是源文件。从堆栈顶部的流读取输入 当lexer中遇到include时

我正在为实时语言OpenPEARL实现一个lexer/解析器。为了更好地构造我的测试套件,我想实现一个与C/C++类似的include文件处理。解析器使用访问者。实现这一点的最佳方法是什么?在实例化嵌套解析器时,我关心的一件事是,所包含的文件不需要包含完整的程序,这取决于它包含的位置

干杯


Marcel

我不能代表ANTLR,但一般来说,在lexer中实现了一个类似C的预处理器

您可以通过拥有一个输入流堆栈来实现这一点,堆栈的基础是源文件。从堆栈顶部的流读取输入

当lexer中遇到include时,会将一个新流推送到堆栈顶部,并继续读取(现在从新流开始)。当流遇到EOF时,您弹出堆栈并继续;如果堆栈为空,lexer将发出一个EOF令牌


您可以滥用这些流来实现宏。在调用宏时,只需推送表示宏体的新流。当您遇到宏参数名时,为提供给相应宏的参数推送一个流。

我见过在(解析器)语法中完成包含处理的实现。像Ira建议的那样在lexer中这样做当然是可能的,但需要一些额外的工作

但是,完全包含处理不仅仅是切换输入流,即宏处理、行拼接、trigraph处理、charizing和Stringzing+作为#if(def)命令的求值器。我在my中实现的所有内容都是为ANTLR 2.7编写的,因此需要更新,但肯定有助于获得想法


在这个项目中,我处理正常ANTLR解析链之外的include文件,这更像是您在C/C++中经常看到的预处理器方法。

#include指令可以出现在任何地方。我同意,如果语言语法显式地包含include指令,那么可以在“include_指令”规则的简化上进行流堆叠。(我的PARLANSE编译器[参见bio]就是这样做的)。与基于lexer的方法相比,我更喜欢这种方法,。。。。。。但是当预处理器独立于语言时,我不知道如何在解析器中处理这个问题。我们构建了一个完整的C和一个完整的C++前端;lexer完成预处理器令牌的基本识别和流交换;lexer和解析器之间的预处理器传递处理对预处理器指令的解析(如果条件具有complexe表达式、字符串化等)。嗯,我找不到解析器方法的示例。仅讨论一般方法:。在Lexer(或者像我一样的输入流)中处理它是完全正确的。