上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo。
备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现。
在简单后缀翻译器代码实现之前,还需要介绍几个基本概念。
1. 自顶向下分析法(top-down parsing)
顾名思义,top-down分析法的思路是推导产生式时,以产生式开始...
分类:
编程语言 时间:
2015-04-06 14:19:05
阅读次数:
384
一个简单的四则运算的中缀转后缀,以及后缀的求值。已测试中缀转后缀:#include#include#include#include#include#include#includestatic stack ss_out; //后缀求值时用来存放后缀表达式的元素static stack ss_opt.....
分类:
其他好文 时间:
2015-04-06 06:22:06
阅读次数:
226
中缀表达式转后缀表达式 2015-04-05 Lover雪儿 1 //中缀表达式转换为后缀表达式(逆波兰表达式) 2 #include 3 #include 4 #include 5 #include 6 7 #define STACK_INIT_SIZE 20...
分类:
其他好文 时间:
2015-04-05 17:18:28
阅读次数:
141
逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便。 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序。 相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则表示为: -+ 3 * 5 + 2 6 1 不再需要括号,机器可...
分类:
其他好文 时间:
2015-04-04 15:00:22
阅读次数:
144
表达式的表示如图所示的二叉树表达式:a+b*(c-d)-e/f若先序遍历此二叉树,按访问结点的先后次序将结点排列起来,其先序序列为: (波兰式,前缀表达式) -+a*b-cd/ef按中序遍历,其中序序列为:a+b*c-d-e/f (中缀表达式)按后序遍历,其后序序列为:abcd-*+ef/-(逆波兰...
分类:
其他好文 时间:
2015-04-03 00:05:23
阅读次数:
184
1.中缀表达式转为后缀表达式规则:(栈实现)1)如果遇到操作数,我们就直接将其输出。2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。4)如果遇到任何其他的操作符,如(“...
分类:
其他好文 时间:
2015-03-28 17:12:57
阅读次数:
158
转自http://blog.csdn.net/mvpsendoh/article/details/6440559目的:将中缀表达式(即标准形式的表达式)转换为后缀式。例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+转换原则:1.当读到一个操作数时,立即将它放到输出中。操作符则不立...
分类:
其他好文 时间:
2015-03-21 15:32:27
阅读次数:
127
#判断运算符的优先级
def opOrder(op1,op2):
order_dic = {'*':4,'$':5,'/':4,'+':3,'-':3}
if op1 == '(' or op2 == '(':
return False
elif op2 == ')':
return True
else:
if orde...
分类:
编程语言 时间:
2015-03-20 22:09:43
阅读次数:
261
【练习3.20】a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算。b.把幂操作符添加到你的指令系统中去。c.编写一个程序将后缀表达式转化为中缀表达式。
分类:
其他好文 时间:
2015-03-20 10:39:20
阅读次数:
130
它们之间的区别在于运算符相对与操作数的位置不同。将中缀表达式转换为前缀表达式:遵循以下步骤:(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;(2) 从右至左扫描中缀表达式;(3) 遇到操作数时,将其压入S2;(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:(4-1) 如果S1为空,或...
分类:
其他好文 时间:
2015-03-20 06:54:53
阅读次数:
165