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开始编写并不是难事。