我正在为实时语言OpenPEARL实现词法分析器/解析器。为了更好地构建我的测试套件,我想实现一个类似于C / C ++的包文件处理。解析器自己使用访问者。实现这一目标的最佳方法是什么?在实例化嵌套解析器时,我所关注的一件事是,包含的文件不需要包含完整的程序,具体取决于它的位置。
干杯
马塞尔
答案 0 :(得分:4)
我不能代表ANTLR,但一般来说,在词法分析器中实现类似C的预处理器。
您可以通过输入流的堆栈来实现此目的,并且堆栈的基础是源文件。您从堆栈顶部的流中读取输入。
当在词法分析器中遇到包含时,会在堆栈顶部推送一个新流,并继续读取(现在从新流中读取)。当流遇到EOF时,弹出堆栈并继续;如果堆栈为空,则词法分析器会发出EOF令牌。
您可以滥用这些流来实现宏。在宏调用上,只需按下表示宏体的新流。遇到宏参数名称时,请为提供给相应宏的参数推送流。
答案 1 :(得分:1)
我已经看到了在(解析器)语法中已经完成包含处理的实现。像艾拉所说的那样在词法分析器中做这件事当然是有可能的,但需要做一些额外的工作。
但是,完全包含处理不仅仅是简单地切换输入流,即宏处理,行拼接,三字符处理,charizing和字符串化+作为#if(def)命令的评估器。我在Windows Resource File Parser中实现的所有内容都是为ANTLR 2.7编写的,因此需要更新,但肯定对获取想法很有帮助。
在这个项目中,我处理普通ANTLR解析链之外的包含文件,这更符合您经常在C / C ++中看到的预处理器方法。