代码之家  ›  专栏  ›  技术社区  ›  Delsilon

C源语言的ply

  •  1
  • Delsilon  · 技术社区  · 6 年前

    我可以使用python-lex-yacc作为词法分析器,使用parser作为C源语言吗?实际上,Yacc使用的是lalr解析,ply使用的是lr解析,这是一种效率相当高、非常适合于较大的语法,但对能够成功解析的语法类型有一定的限制。现在我正在做编译器课程,还有解析部分。所以不太了解LALR解析。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ira Baxter    6 年前

    GCC编译器使用LALR解析器生成器bison实现多年。LR比LALR更强大,所以从技术上讲你可以做到。

    现在,你是否想这样做是另一个问题。拉尔对C的某些令人讨厌的特性(哇,像“bigly”这样的王牌)毫无帮助,各种各样的雷克斯黑客被用来让它工作。(见我的SO答案)为什么C/C++不能用纯LR解析器解析: https://stackoverflow.com/a/1004737/120163 )尽管如此,它还是很长一段时间有用。

    现在,听起来你在做一个编译器类。在这种情况下,您可能没有实现“全部C”,而是一个有趣的子集/变体。在这种情况下,你应该能够设计出你的“C-like”语法,把它从C的麻烦点弯开,继续你的课程。在学习如何对lalr/lr解析器进行黑客攻击以处理奇怪的语法问题方面,您的课程没有什么意义。在课堂上,你需要学习的是解析器的工作,以及它们如何适应编译器的整体结构;添加怪癖并不能提高学习基础知识的能力。如果您完成了这个类,并开始为真正的语言构建解析器,那么您很快就会遇到这些问题,然后可以处理它们。

    如果您能决定语言语法,那么LALR解析就可以了。