我正在编写一个将 Tiny C 代码转换为 Python 代码的编译器,但我需要构建一个预处理器解决方案来替换#define
和管理编译器 C 指令(#ifdef、#else、#define ...)
我选择在 Python 中使用 pcpp 模块,但没有成功……在完整的 Tatsu 解决方案中是否有可能提供解决方案?
我正在编写一个将 Tiny C 代码转换为 Python 代码的编译器,但我需要构建一个预处理器解决方案来替换#define
和管理编译器 C 指令(#ifdef、#else、#define ...)
我选择在 Python 中使用 pcpp 模块,但没有成功……在完整的 Tatsu 解决方案中是否有可能提供解决方案?
不幸的是,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
将让解析器报告原始源代码行的错误。
对于带有宏的预处理器,您可能需要预处理器的解析器和主要语言的解析器。诀窍是让第一个解析器保留第二个解析器的行信息。
预处理器可以单独运行,但它必须注入足够的元数据以允许主解析器恢复原始行信息。