【编译原理】六、四则运算支持括号及括号嵌套

1. 前言

在上一篇文章中,我们实现了简单四则运算,现在我们在此基础上,让四则运算支持括号。支持括号嵌套

2. 改写生成式

在简单四则运算的基础上,进行改写,如下所示:

compound_expr = (basic_expr | bracket_expr) ([+-*/] compound_expr )*
bracket_expr = '(' basic_expr ')' | '(' bracket_expr ')'
basic_expr = number ([+-*/] number)*

3. 改写代码

生成式改写起来比较简单,但是代码难度上升了一个层级。因为简单四则运算只包含一个生成式,而支持括号的四则运算包含了三个生成式。

3.1 代码地址

https://gitee.com/pivotfuture/four-arithmetic/tree/support_brackets

需要说明的是,以上代码以实现功能为主,并没有做到精简优化,但是相对来说更容易看懂和调试。

3.1 实现细节

新的生成式,包含三层语法节点。其中:

  • compound_expr:存在右递归,使用 while 不断向后处理即可。
  • bracket_expr:起始符为 ‘(’,结束符为 ‘)’,存在右递归,使用 while 不断向后处理即可。
  • basic_expr:起始符为 number,即数字

先检测起始符,再从上向下分解调用子表达式进行解析,再通过 while 循环向后不断读取输入文本,解析文本,从而实现带可嵌套括号的四则运算。

注意,关于四则运算优先级的处理,可以使用栈来实现,此部分内容属于计算机基础,和编译原理关系不大,可以参考相关资料。

4. 总结

实现四则运算的编译,重点在于要清楚表达式的一般解析流程是什么,即确定起止符号,进行向下分解。基本上只要掌握了其基本逻辑,自己动手从0开始编写并不是难事。

你可能感兴趣的:(编译原理,编译原理)