ANTLR4:实现C的最佳方法是什么,包括文件处理?

时间:2016-11-20 23:24:21

标签: antlr antlr4

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

干杯

马塞尔

2 个答案:

答案 0 :(得分:4)

我不能代表ANTLR,但一般来说,在词法分析器中实现类似C的预处理器。

您可以通过输入流的堆栈来实现此目的,并且堆栈的基础是源文件。您从堆栈顶部的流中读取输入。

当在词法分析器中遇到包含时,会在堆栈顶部推送一个新流,并继续读取(现在从新流中读取)。当流遇到EOF时,弹出堆栈并继续;如果堆栈为空,则词法分析器会发出EOF令牌。

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

答案 1 :(得分:1)

我已经看到了在(解析器)语法中已经完成包含处理的实现。像艾拉所说的那样在词法分析器中做这件事当然是有可能的,但需要做一些额外的工作。

但是,完全包含处理不仅仅是简单地切换输入流,即宏处理,行拼接,三字符处理,charizing和字符串化+作为#if(def)命令的评估器。我在Windows Resource File Parser中实现的所有内容都是为ANTLR 2.7编写的,因此需要更新,但肯定对获取想法很有帮助。

在这个项目中,我处理普通ANTLR解析链之外的包含文件,这更符合您经常在C / C ++中看到的预处理器方法。