首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR4:实现C语言的最佳方法是什么,比如包含文件处理?

ANTLR4:实现C语言的最佳方法是什么,比如包含文件处理?
EN

Stack Overflow用户
提问于 2016-11-21 07:24:21
回答 2查看 886关注 0票数 2

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

干杯

马塞尔

EN

回答 2

Stack Overflow用户

发布于 2016-11-21 12:48:52

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

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2016-11-21 16:18:00

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

然而,完整的包含处理不仅仅是简单地切换输入流,即宏处理、行拼接、三元组处理、字符化和字符串+作为#if(def)命令的计算器。我在我的Windows Resource File Parser中实现了所有的东西,它是为ANTLR2.7编写的,因此需要更新,但对于获得想法肯定是有好处的。

在这个项目中,我处理普通ANTLR解析链之外的include文件,这更多地遵循了您经常在C/C++中看到的预处理器方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40710645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档