【问题标题】:ANTLR4: What is the best approach to implement C like include file handling?ANTLR4:实现 C 语言(如包含文件处理)的最佳方法是什么?
【发布时间】:2016-11-20 23:24:21
【问题描述】:

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

干杯

马塞尔

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

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

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

    当在词法分析器中遇到包含时,一个新的流被压入堆栈顶部,并且继续读取(现在从新流中)。当流遇到 EOF 时,您弹出堆栈并继续;如果堆栈为空,则词法分析器发出 EOF 标记。

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

    【讨论】:

      【解决方案2】:

      我已经看到在(解析器)语法中完成了包含处理的实现。像 Ira 建议的那样在词法分析器中执行此操作当然是可能的,但需要一些额外的工作。

      然而,完整的包含处理不仅仅是切换输入流,即宏处理、线拼接、三元组处理、字符化和字符串化 + 作为 #if(def) 命令的求值器。我在我的Windows Resource File Parser 中实现的所有内容,它是为 ANTLR 2.7 编写的,因此需要更新,但对于获得想法肯定有好处。

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

      【讨论】:

      • 这对 C 有什么作用? #include 指令可以出现在任何地方。我同意,如果语言语法明确包含包含指令,那么可以在减少“include_directive”规则时进行流堆叠。 (我的 PARLANSE 编译器 [参见 bio] 就是这样做的)。我更喜欢这种方法而不是基于词法分析器的方法,...
      • ...但是当预处理器独立于语言时,我看不到如何在解析器中处理这个问题。我们构建了一个完整的 C 和一个完整的 C++ 前端; lexer 对预处理器标记和流切换进行基本识别;词法分析器和解析器之间的预处理器传递处理解析预处理器指令(如果条件具有复杂的表达式、字符串化等)
      • 嗯,我找不到解析器方法 atm 的示例。仅讨论一般方法:groups.google.com/forum/#!searchin/antlr-discussion/…。在 Lexer 中处理它(或像我一样的输入流)完全没问题。
      猜你喜欢
      • 1970-01-01
      • 2014-04-11
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      相关资源
      最近更新 更多