如何使用pyparsing构建完整的C解析器?

1 投票
1 回答
1655 浏览
提问于 2025-04-18 18:21

我正在尝试使用pyparsing构建一个完整的C语言解析器。

其实我这个项目的目标是识别我感兴趣的C程序中的某些代码行。例如,复杂的赋值语句、类型转换、指针解引用等等。

我想,既然我已经投入了精力,就干脆在pyparsing中实现完整的C语言语法,然后只用我需要的部分。

我参考了这个YACC的C语言语法,并根据我对pyparsing有限的理解进行了编写。 http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#translation-unit

不过,我遇到的问题是,pyparsing陷入了无限循环。我在这里上传了我的Python代码。 https://gist.github.com/gkernel/18cd1d38376d07db989a

我需要在这方面的帮助。如果你知道其他解决我问题的方法,也请告诉我。

编辑: 为了更清楚,我的代码可能有bug,但我已经花了时间检查我写的语法是否正确。我基本上想问一下,pyparsing能否用于这么复杂的事情。

我做的其中一件事是使用Forward()声明语法中的所有非终结符,我想知道这样做是否正确。我这么做是因为Python会抱怨某些名称未定义。

1 个回答

2

据我所知,pyparsing 是用来创建递归下降语法的。递归下降语法如果遇到左递归的语法,就会陷入无限循环。而你找到的那个比较古老的C语言语法(还有任何更新的C语言语法)很可能就是左递归的,因为这种语法写起来比较简单,而且可以被像bison这样的LALR(1)和GLR解析器生成器接受。

C语言并不是一个容易解析的语言,尤其是如果你对解析理论的基础知识还不太了解的话。如果你的目标是学习解析理论,我建议你先尝试一些简单的语言。如果你只是想解析C语言,正如你问题中所提到的,那我建议你使用一些现成的工具;gccclang都有(虽然文档不太完善)可以访问C程序解析树的机制,如果你的预算允许,还有一些商业产品可以选择。

撰写回答