parsing - C 源语言的 PLY
问题描述
我可以将 python lex yacc 用于 C 源语言的词法分析器和解析器吗?实际上已经写了 yacc 使用 LALR-parsing,PLY 使用 LR-parsing,这相当有效并且非常适合较大的语法,但稍微限制了可以成功解析的语法类型。现在我正在学习编译器课程,但仍然要做解析部分。所以不太了解LALR解析。
解决方案
多年来,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 解析就很好。
推荐阅读
- javascript - 在构建时临时禁用 Next.js 页面
- keras - 如何连接类似 BERT 的句子表示和词嵌入 - Keras & huggingface
- ffmpeg - 如何使用 Gphoto2 + ffmpeg 捕获电影并将服务重定向到 html 嵌入
- ibm-doors - 在 DXL 中,如何获取我没有在 DXL 脚本中自己打开的模块的句柄
- c# - C# 源代码生成器在 Razor 视图中表现不佳
- javascript - Javascript无法获取元素的内容
- r - 在 R studio 中制作 GO 术语的点图有问题
- .net - 更新列表类型的视图模型属性
来自 HTML.TextBoxFor - javascript - 如何将几个数组运算符合并为一个?Javascript
- artificial-intelligence - pacman 启发式函数的问题