0

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

我选择在 Python 中使用 pcpp 模块,但没有成功……在完整的 Tatsu 解决方案中是否有可能提供解决方案?

4

1 回答 1

0

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

大家可以看看是如何Buffer.include() 实现的,将原来的行和行信息替换为转换产生的块的那些。

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将让解析器报告原始源代码行的错误。

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

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

于 2019-10-08T22:29:50.677 回答