【问题标题】:How to build preprocessor solution with Tatsu?如何使用 Tatsu 构建预处理器解决方案?
【发布时间】:2019-11-14 01:52:59
【问题描述】:

我正在编写一个将 Tiny C 代码转换为 Python 代码的转换器,但我需要构建一个预处理器解决方案来替换 #define 并管理编译器 C 指令(#ifdef、#else、#define...)

我选择在 Python 中使用 pcpp 模块,但没有成功...是否可以在完整的 Tatsu 解决方案中找到解决方案?

【问题讨论】:

  • 也许您最好针对您使用 pcpp 遇到的问题提出一个具体问题,这是一个实际的 C 预处理器。解析器生成器不会帮助您实现宏预处理器。
  • 你说得对,但原始代码不是 C 代码,而是脚本代码,只有预处理器代码,如“#define ...”,语法不是 C。
  • 无论如何,宏预处理器不在上下文无关语法的预期用例中。
  • 宏预处理器只是编译器的另一种形式,因此所有编译器理论都适用于它们。 @rici。

标签: c-preprocessor tatsu


【解决方案1】:

不幸的是,TatSu 支持预处理的部分没有记录。

大家可以看看Buffer.include()is implemented是如何将原来的行和行信息替换成转换产生的块的。

def include(self, lines, index, i, j, name, block, **kwargs):
        blines, bindex = self._preprocess_block(name, block, **kwargs)
        assert len(blines) == len(bindex)
        lines[i:j] = blines
        index[i:j] = bindex
        assert len(lines) == len(index)
        return j + len(blines) - 1

基本上,您可以使用自己的Buffer 类挂钩预处理方法,并以任何方式转换文本。 LineIndexInfo 的正确列表将让解析器根据原始源代码行报告错误。

对于带有宏的预处理器,您可能需要一个用于预处理器的解析器和一个用于主要语言的解析器。诀窍是让第一个解析器为第二个解析器保留行信息。

预处理器可以单独运行,但它必须注入足够多的元数据以允许主解析器恢复原始行信息。

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 2011-04-22
    • 2011-12-24
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多