首页 > 解决方案 > C 源语言的 PLY

问题描述

我可以将 python lex yacc 用于 C 源语言的词法分析器和解析器吗?实际上已经写了 yacc 使用 LALR-parsing,PLY 使用 LR-parsing,这相当有效并且非常适合较大的语法,但稍微限制了可以成功解析的语法类型。现在我正在学习编译器课程,但仍然要做解析部分。所以不太了解LALR解析。

标签: parsingyacclex

解决方案


多年来,GCC 编译器是使用 Bison(一种 LALR 解析器生成器)实现的。LR比LALR强,所以技术上可以做到。

现在,您是否愿意这样做是另一个问题。LALR 对 C 的某些令人讨厌的(哇,像“大”这样的特朗普主义)功能没有帮助,并且使用了各种 lexer hack 来使其工作。(请参阅我关于为什么不能使用纯 LR 解析器解析 C/C++ 的 SO 答案:https ://stackoverflow.com/a/1004737/120163 )。尽管如此,它还是有用了很长时间。

现在,听起来你正在做一个编译器类。在这种情况下,您可能没有实现“所有 C”,而是一个有趣的子集/变体。在这种情况下,你应该能够设计出你的“类 C”语法,将它从 C 的麻烦点移开,然后继续你的课程。你的班级学习如何破解 LALR/LR 解析器来处理奇怪的语法问题没有什么意义。你需要在课堂上学习解析器做什么,以及它们如何适应编译器的整体结构;添加怪异不会改善学习基础知识。如果你完成了这门课,并着手为真正的语言构建解析器,那么你很快就会遇到这些问题,然后就可以处理它们了。

如果您决定语言语法,则 LALR 解析就很好。


推荐阅读