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

标签 python c parsing yacc pyparsing

<分区>

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

实际上,我的项目想要的是识别我感兴趣的 C 程序中的某些代码行。例如。具有类型转换、指针解引用等的复杂赋值指令。

我想,既然我投入了精力,我将在 pyparsing 中实现 Full C Grammar,并使用我需要的东西。

我引用了这个YACC的C Grammar,按照pyparsing写的(尽我对pyparsing的有限理解)。 http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#translation-unit

然而,我得到的是 pyparsing 陷入无​​限循环。我已经在这里上传了python代码。 https://gist.github.com/gkernel/18cd1d38376d07db989a

我需要这方面的帮助。如果您知道,还请告诉我解决我的问题的替代方法。

编辑: 需要明确的是,代码中可能存在错误,但我已经投入精力检查我是否编写了正确的语法。我基本上想问一下 pyparsing 是否可以用于像这样复杂的事情。

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

最佳答案

据我所知,pyparsing 创建递归下降语法。如果使用左递归文法,递归下降文法将进入无限循环,并且您发现的相当古老的 C 文法(以及任何更现代的 C 文法)很可能是左递归的,因为这样的文法是更易于编写,并且是 LALR(1) 和 GLR 解析器生成器可接受的输入,例如 bison

C 不是一种容易解析的语言,如果您不了解解析理论的基础知识,则更是如此。如果你的目标是学习解析理论,我建议你尝试一种更简单的语言。如果您的唯一目标是解析 C,如您的问题所示,那么我建议您使用其中一种可用的工具; gccclang 都带有(不幸的是文档不足)访问 C 程序的解析树的机制,如果您有预算,也有商业产品。

关于python - 如何使用 pyparsing 构建完整的 C 解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25472242/

相关文章:

用于搜索哈希值中特定字符串的Python程序(编码帮助)

python - 将重新缩放层(或与此相关的任何层)添加到经过训练的 tensorflow keras 模型

c - 此代码是否将毫秒返回到纪元时间的秒数

c++ - GNU Bison 生成的解析器在给定非空文件时抛出段错误 11

c - C语言中的字符串连接?

swift - 如何在 MacOS (Swift) 上解析 iBeacon

python - Python的嵌套 "if-else"与具有 "if"条件的 "and"不同吗?

Python heapq 没有按正确的顺序推送?

python - 使用 tf.data.Dataset.batch 时出现的问题

java - 如何解析xls文件? (已知语言: Python, Java、Lua)