我如何实现解析?

san*_*aha 1 c compiler-construction parsing

我正在用C设计一个编译器.我想知道我应该使用哪种技术,自上而下或自下而上?我只使用自下而上实现了运算符优先级.我已应用以下规则:

E:=E+E
E:=E-E
E:=E/E
E:=E*E
E:=E^E
Run Code Online (Sandbox Code Playgroud)

我想知道我马上去了吗?如果我想包含if-else,循环,数组,函数,我是否需要实现解析?如果是,我该如何实施呢?任何人都可以只实现令牌收集和运算符优先级.接下来的步骤是什么?

Jac*_*ack 8

Lex&Yacc是您的答案.或Flex和Bison是原始工具的分支版本.

它们是免费的,它们是用C编写词法分析器和解析器的真正标准,并且在各处使用.

此外,O'Reilly还发布了300页珍珠:Flex&Bison.我买了它,它真的解释了如何为编程语言编写一个好的解析器并处理所有微妙的事情(错误恢复,冲突,范围等).它还将回答您关于如何解析表达式的问题:您的方法适用于自上而下的解析器,但您会发现这不足以处理运算符优先级.

当然,对于业余爱好,你可以编写自己的词法分析器和解析器,但这只是学术上的努力,很好理解FSM和解析器如何工作,但没有那么多的乐趣:)

相反,如果您对编程语言设计或复杂实现感兴趣,我建议使用本书:编程语言语用学因为Dragon Book而不是很有名,但它确实解释了为什么以及如何在编译器中实现各种特性.龙书也是一本圣经,它将覆盖一个真正的低级如何写一个解析器..但它会有点无聊,我警告你..

  • 因为Yacc在正确使用之前需要基本的语法知识.你现在浪费在理解它的时间将在以后快速编写规则时保存.如果你要手工编写解析器,请准备好花费大量时间. (2认同)