生成C语言声明

3

关于如何解析C声明的话题已经有很多文章了。

我需要做相反的事情:接收一个类型的树形表示,加上变量名称,并将其打印为对应的C源代码声明。

是否有人写下了这样的算法,并提供可用的形式?

(我尝试查看https://github.com/ridiculousfish/cdecl-blocks,它似乎必须包含这样的内容,但是我在其中找到的与其功能相关的所有代码中,都没有生成C声明的代码。)


1
所以你需要将AST“漂亮地打印”成C源代码吗?如果是的话,请查看pycparser和示例,这是一个可以完成此任务的Python库。 - Morten Jensen
1
我会查看语言标准中的EBNF语法。你想要解决的问题是生成句子。 - Davislor
1
对于相对简单的类型,可能只需要按照应该出现的顺序检查每个限定符的AST表示。主要的复杂性在于像 const foo (*const array_of_foo)[N]; 这样的东西。 - Davislor
@MortenJensen,我正在查看pycparser的代码,发现有很多用于将C源代码解析为AST的代码,但没有相反的功能。我错过了什么? - rwallace
1
@rwallace 请看下面的答案,它藏在 examples/c-to-c.py 中。 - Morten Jensen
1个回答

2
Eli Bendersky的Python库pycparser有一个示例,将C代码解析为AST表示形式,并进行漂亮打印,再将其转换回C代码。
具体的示例可以在这里找到,我认为对您有用的部分是这个:
def _zz_test_translate():
    # internal use
    src = r'''
    void f(char * restrict joe){}
    int main(void)
    {
        unsigned int long k = 4;
        int p = - - k;
        return 0;
    }
    '''
    parser = c_parser.CParser()
    ast = parser.parse(src)
    ast.show()
    generator = c_generator.CGenerator()

    print(generator.visit(ast))

这个例子的作用是,它从字符串(src)中解析出C -> AST。然后pretty print AST (ast.show())。最后将AST转换为C源代码并打印出来。
此示例使用 c_generator 模块,该模块在 这里可以找到。它是一个类,带有一个 visit 方法,可以遍历 AST 并输出 C 代码。
我已经使用它来调整 C 代码,例如在函数调用或返回点之前插入代码。应该可以编程方式定义结构声明,然后将其转换为 C。
根据您的描述,听起来这可能会有用?无论是直接从 AST 格式-> C 源,还是作为自己工作的灵感来源,都可以提供一些您想要转换为 C 代码的结构声明的示例吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接