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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PE括号表达式是编译原理中用于构建语法树的实验。PE(Parsing Expression)是一种从正则表达式扩展而来的表达式语言,用于描述一些特定语法规则。在编译原理中,我们需要将源代码转化为可执行的程序,而构建语法树是其中一个重要的步骤。 PE括号表达式可以用于定义语法规则中的一些基本元素,如标识符、关键字、运算符等。通过使用括号将这些基本元素组合起来,可以实现复杂的语法规则,并将其转化为语法树。 PE括号表达式具有以下特点: 1. 可以使用括号进行分组,用于定义运算符的优先级和结合性。 2. 可以使用嵌套括号表达式,用于定义复杂的语法规则。 3. 可以使用特殊符号来表示选择和循环,如“|”表示选择,而“*”表示零次或多次。 使用PE括号表达式构建语法树的过程如下: 1. 将源代码按照语法规则进行分割,得到一系列的语法单元。 2. 使用PE括号表达式对每个语法单元进行匹配,将其转化为相应的语法树节点。 3. 将匹配到的语法树节点连接起来,构建出完整的语法树。 4. 根据语法树进行语义分析和代码生成,最终生成可执行的程序。 PE括号表达式实验编译原理的核心目标是理解和掌握如何使用PE括号表达式描述和解析语法规则,进而实现源代码的转换和生成。通过这个实验,我们可以深入了解编译原理的相关概念和技术,并培养编写高效、可靠的编译器的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撬动未来的支点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值