我正在用C设计一个编译器。我想知道我应该使用哪种技术,自上而下或自下而上?我只使用自下而上实现了运算符优先级。我申请了以下内容 规则:
E:=E+E
E:=E-E
E:=E/E
E:=E*E
E:=E^E
我想知道我马上走了吗? 如果我想包含if-else,循环,数组,函数,我是否需要实现解析? 如果是,我该如何实施呢?任何人都行 我只实现了令牌集合和运算符优先级。接下来的步骤是什么?
答案 0 :(得分:9)
Lex & Yacc是你的答案。或Flex和Bison是原始工具的分支版本。
它们是免费的,它们是用C语言编写词法分析器和解析器的真正标准,并且随处可用。
此外,O'Reilly发布了300页的小珍珠:Flex & Bison。我买了它,它真的解释了如何为编程语言编写一个好的解析器并处理所有微妙的事情(错误恢复,冲突,范围等)。它还将回答您关于如何解析表达式的问题:您的方法适用于自上而下的解析器,但您会发现这不足以处理运算符优先级。
当然,对于业余爱好,你可以编写自己的词法分析器和解析器,但这只是学术上的努力,很好理解FSM和解析器如何工作但没有那么多乐趣:)
如果您对编程语言设计或复杂实现感兴趣,我建议使用本书:Programming Language Pragmatics由于Dragon Book而不是很有名,但它确实解释了为什么以及如何使用各种特性并应在编译器中实现。龙书也是一本圣经,它将覆盖一个真正的低级如何写一个解析器..但它会有点无聊,我警告你..
答案 1 :(得分:1)
在C中实现良好解析器的最佳方法是使用flex & yacc
答案 2 :(得分:1)
如果没有更具体,更详细的问题,你的问题就很模糊,难以回答。 "Dragon book"是一个很好的参考,但对于那些寻求从头开始实现编译器的人,或其他人指出Lex和Yacc。
答案 3 :(得分:0)
如果您打算手动实现解析器,您将需要执行recursive descent解析器。代码直接反映了语法,因此很容易理解和理解。它对你的语法有一些限制(你不能有任何左递归的非终结符号),但你可以解决这些问题。
然而,这取决于语法的复杂性;对于任何比基本算术表达式复杂得多的任何东西,解析一个解析器变得非常繁琐。如果您尝试实现任何看起来像真正的编程语言的东西,请使用像yacc
或bison
这样的解析器生成器。