PLY 为 C 源语言
PLY for C source language
我可以将 python lex yacc 用于 C 源语言的词法分析器和解析器吗?其实已经写过yacc使用的是LALR-parsing,PLY使用的是LR-parsing,效率还算高,很适合比较大的文法,但是稍微限制了能成功解析的文法类型。现在我正在上编译器课程,并且还在做解析部分。所以对LALR解析了解不多
多年来,GCC 编译器都是使用 LALR 解析器生成器 Bison 实现的。 LR比LALR强,技术上可以做到。
现在,你想不想做是另一个问题。 LALR 对 C 的某些讨厌的(哇,像 "bigly" 这样的王牌主义)功能没有帮助,并且使用了各种词法分析器 hack 来使其工作。 (请参阅我关于为什么 C/C++ 不能用纯 LR 解析器解析的 SO 回答:)。尽管如此,它还是用了很长时间。
现在,听起来你在做一个编译器 class。在这种情况下,您可能没有实现 "all of C",而是一个有趣的 subset/variant。在这种情况下,您应该能够设计您的 "C-like" 语法,将其从 C 的问题点转移开,然后继续您的 class。您的 class 学习如何破解 LALR/LR 解析器来处理奇怪的语法问题毫无意义。您需要在 class 中学习的是解析器的作用,以及它们如何适应编译器的整体结构;添加怪异不会改善学习基础知识。如果您完成 class,并着手为真正的语言构建解析器,您很快就会遇到这些问题,然后就可以处理它们。
如果您决定语言语法,LALR 解析就很好。
我可以将 python lex yacc 用于 C 源语言的词法分析器和解析器吗?其实已经写过yacc使用的是LALR-parsing,PLY使用的是LR-parsing,效率还算高,很适合比较大的文法,但是稍微限制了能成功解析的文法类型。现在我正在上编译器课程,并且还在做解析部分。所以对LALR解析了解不多
多年来,GCC 编译器都是使用 LALR 解析器生成器 Bison 实现的。 LR比LALR强,技术上可以做到。
现在,你想不想做是另一个问题。 LALR 对 C 的某些讨厌的(哇,像 "bigly" 这样的王牌主义)功能没有帮助,并且使用了各种词法分析器 hack 来使其工作。 (请参阅我关于为什么 C/C++ 不能用纯 LR 解析器解析的 SO 回答:)。尽管如此,它还是用了很长时间。
现在,听起来你在做一个编译器 class。在这种情况下,您可能没有实现 "all of C",而是一个有趣的 subset/variant。在这种情况下,您应该能够设计您的 "C-like" 语法,将其从 C 的问题点转移开,然后继续您的 class。您的 class 学习如何破解 LALR/LR 解析器来处理奇怪的语法问题毫无意义。您需要在 class 中学习的是解析器的作用,以及它们如何适应编译器的整体结构;添加怪异不会改善学习基础知识。如果您完成 class,并着手为真正的语言构建解析器,您很快就会遇到这些问题,然后就可以处理它们。
如果您决定语言语法,LALR 解析就很好。