1+2*3/7+123+(1+3*5)
1.如果遇到数据则加入左侧
2.如果遇到运算符,优先级较高,入左侧,先入数,然后在其右侧入运算符
如果优先级较低或相等,或者栈空,则入右侧
3.遇到括号,则入左侧
4.在栈中记录当前节点的位置
符号入栈时,同时将运算符保存
如: 2+3*(5+7)+8
过程如下:
1.取得数据2,入栈,
2.取运算符+,由于栈空,入栈,写入树当前节点的左侧,和数据一起,先入数据
3.取得数据3,入栈
4.取得运算符*,优先级较高,入栈,同时将数据和此运算符写入树当前节点左侧
5.取得运算符(,优先级较高,入栈,下一节点将是当前节点的左节点,设置标志
6.取得数据5,入栈
7.取得运算符+,优先级较高,入栈,置于当前节点左侧
8.取得数据7,入栈
9.取得运算符),优先级较低,将数据写入当前节点右侧
出栈,直到遇到(,当前节点切换到运算符栈顶所指节点
10.取得运算符,优先级较低,同时上一个非数据,
则出栈,直到运算符优先级变得较高,当前节点切换到最后出栈的运算符的位置
将当前运算符置于右侧,
11.取得数据,入栈
12.取得结束符,优先级最低,将数据写入当前节点右侧
出栈,直到运算符优先级变得较高,
当前节点切换到最后出栈的运算符的位置
以栈顶的运算符表示当前位置
当后面得运算符较低时,可能会出空栈,则当前节点位置由最后一个元素确定
如果栈空,则以最后出栈的运算符节点作为当前位置
如果上一个为运算符或者为空,同时这一个为单目运算符,则表示对下一个数的计算
如果上一个为数据,而运算符置于左侧,则一般数据放在运算符之前
对于:-2
取得运算符-,因为没有数据表示对下一个数计算,
将运算符直接入栈,并将下一节点置入左侧,
通常单目运算符优先级最高,相邻的两个单目运算符后者比前者高
2004年10月16日 11:25:09
abc := fun1(2 + 3, 4 * 5);
// 词法分析结果
abc
otAssign:-20
otFun:-380
2
otAdd:-1
3
otNext:60
4
otMul:-160
5
otRight:1
otEnd:20
// 表达式语法分析
Push Data-1-V:abc
Data:abc
Oper:
Buff:abc
Push Oper-2:otAssign
Data:abc
Oper:otAssign
Buff:abc-1,otAssign
Push Oper-2:otFun
Data:abc
Oper:otAssign,otFun
Buff:abc-R1,otAssign-L2,otFun
Push Data-6:2
Data:abc,2
Oper:otAssign,otFun
Buff:abc-R1,otAssign-L2,otFun,2
Push Oper-2:otAdd
Data:abc,2
Oper:otAssign,otFun,otAdd
Buff:abc-R1,otAssign-L2,otFun-L3,2-R4,otAdd
Push Data-6:3
Data:abc,2,3
Oper:otAssign,otFun,otAdd
Buff:abc-R1,otAssign-L2,otFun-L3,2-R4,otAdd-R5,3
Pop Data-3:3
Data:abc,2
Oper:otAssign,otFun,otAdd
Buff:abc-R1,otAssign-L2,otFun-L3,2-R4,otAdd-R5,3
Pop Oper-5:otAdd
Data:abc,2
Oper:otAssign,otFun
Buff:abc-R1,otAssign-L2,otFun-L3,2-R4,otAdd-R5,3
Push Oper-5:otNext
Data:abc,2
Oper:otAssign,otFun,otNext
Buff:abc-R1,otAssign-L2,otFun-L3-R6,2-R4,otAdd-R5,3,otNext
Push Data-6:4
Data:abc,2,4
Oper:otAssign,otFun,otNext
Buff:abc-R1,otAssign-L2,otFun-L3-R6,2-R4,otAdd-R5,3,otNext,4
Push Oper-2:otMul
Data:abc,2,4
Oper:otAssign,otFun,otNext,otMul
Buff:abc-R1,otAssign-L2,otFun-L3-R6,2-R4,otAdd-R5,3,otNext,4,otMul
Push Data-6:5
Data:abc,2,4,5
Oper:otAssign,otFun,otNext,otMul
Buff:abc-R1,otAssign-L2,otFun-L3-R6,2-R4,otAdd-R5,3,otNext-L6,4-R7,otMul-R8,5
Pop Data-3:5
Data:abc,2,4
Oper:otAssign,otFun,otNext,otMul
Pop Oper-5:otMul
Data:abc,2,4
Oper:otAssign,otFun,otNext
Pop Data-3:4
Data:abc,2
Oper:otAssign,otFun,otNext
Pop Oper-5:otNext
Data:abc,2
Oper:otAssign,otFun
Pop Data-3:2
Data:abc
Oper:otAssign,otFun
Pop Oper-3:otFun
Data:abc
Oper:otAssign
Pop Data-3:abc
Data:
Oper:otAssign
Pop Oper-5:otAssign
Data:
Oper:
2004年10月17日 11:22:01
Expr:
abc := fun1(2 + 3, 4 * 5);
词法分析
Data: abc,Left: 0
Oper: otAssign:-20,Left: 0
Oper: otFun:-380,Left: 0
Data: 2,Left: 0
Oper: otAdd:-1,Left: 0
Data: 3,Left: 0
Oper: otNext:60,Left: 0
Data: 4,Left: 0
Oper: otMul:-1,Left: 0
Data: 5,Left: 0
Oper: otRight:1,Left: 0
Oper: otEnd:20,Left: 0
语法分析
Push_1 Data: abc,Left: 0
Push_2 Oper: otAssign:-20,Left: 0
Push_2 Oper: otFun:-400,Left: 0
Push_6 Data: 2,Left: 0
Push_2 Oper: otAdd:-100,Left: 0
Push_6 Data: 3,Left: 0
Pop__2 Data: 3,Left: 5
Pop__5 Oper: otAdd:-100,Left: 4
Set__1 Data: otAdd,Left: 4
Push_5 Oper: otNext:-40,Left: 6
Push_6 Data: 4,Left: 0
Push_2 Oper: otMul:-200,Left: 0
Push_6 Data: 5,Left: 0
Pop__2 Data: 5,Left: 9
Pop__5 Oper: otMul:-200,Left: 8
Set__1 Data: otMul,Left: 8
Pop__2 Data: otMul,Left: 8
Pop__5 Oper: otNext:-40,Left: 6
Set__1 Data: otNext,Left: 6
Pop__2 Data: otNext,Left: 6
Pop__3 Oper: otFun:-400,Left: 2
Pop__2 Data: abc,Left: 0
Pop__5 Oper: otAssign:-20,Left: 1
2004年10月17日 11:46:41
Push_1 Data: abc,Left: 0
Push_2 Oper: otAssign:-20,Left: 0
Push_2 Oper: otFun:-400,Left: 0
Push_6 Data: 2,Left: 0
Push_2 Oper: otAdd:-100,Left: 0
Push_6 Data: 3,Left: 0
Pop__2 Data: 3,Left: 5
Pop__5 Oper: otAdd:-100,Left: 4
Set__2 Data: otAdd,Left: 4
Push_5 Oper: otNext:-40,Left: 6
Push_6 Data: 4,Left: 0
Push_2 Oper: otMul:-200,Left: 0
Push_6 Data: 5,Left: 0
Pop__2 Data: 5,Left: 9
Pop__5 Oper: otMul:-200,Left: 8
Set__2 Data: otMul,Left: 8
Pop__2 Data: otMul,Left: 8
Pop__5 Oper: otNext:-40,Left: 6
Pop__2 Data: otAdd,Left: 4
Pop__3 Oper: otFun:-400,Left: 2
Call_1 Oper: otFun:-400,Left: 2
Set__1 Oper: otFun:-400,Left: 2
Pop__2 Oper: otFun:-400,Left: 2
Pop__5 Oper: otAssign:-20,Left: 1
Set__2 Data: otAssign,Left: 1
2004年10月17日 14:32:39
Oper: otFun:-400,Left: -1, Right: 0
Data: 1,Left: -1, Right: 1
Oper: otNext:-1,Left: -1, Right: 2
Data: 2,Left: -1, Right: 3
Oper: otRight:1,Left: -1, Right: 4
Push_2 Oper: otFun:-400,Left: -1, Right: 0
Push_6 Data: 1,Left: -1, Right: 1
Push_2 Oper: otNext:-40,Left: -1, Right: 2
Push_6 Data: 2,Left: -1, Right: 3
Pop__2 Data: 2,Left: -1, Right: 3
Pop__5 Oper: otNext:-40,Left: 1, Right: 2
Pop__2 Data: 1,Left: -1, Right: 1
Pop__3 Oper: otFun:-400,Left: 2, Right: 0
Call_1 Oper: otFun:-400,Left: 2, Right: 0
Set__1 Oper: otFun:-400,Left: 2, Right: 0
2004年10月17日 16:35:53
Data: Var: abc,Left: -1, Right: -1
Oper: otAssign:-20,Left: -1, Right: -1
Oper: otFun:-380,Left: -1, Right: -1
Data: 2,Left: -1, Right: -1
Oper: otAdd:-1,Left: -1, Right: -1
Data: 3,Left: -1, Right: -1
Oper: otNext:60,Left: -1, Right: -1
Data: 4,Left: -1, Right: -1
Oper: otMul:-1,Left: -1, Right: -1
Data: 5,Left: -1, Right: -1
Oper: otRight:1,Left: -1, Right: -1
Oper: otEnd:1,Left: -1, Right: -1
Push_1 Data: Var: abc,Left: -1, Right: -1
Push_2 Oper: otAssign:-20,Left: -1, Right: -1
Push_2 Oper: otFun:-400,Left: -1, Right: -1
Push_6 Data: 2,Left: -1, Right: -1
Push_2 Oper: otAdd:-100,Left: -1, Right: -1
Push_6 Data: 3,Left: -1, Right: -1
Pop__2 Data: 3,Left: -1, Right: -1
Pop__5 Oper: otAdd:-100,Left: 5, Right: -1
Set__2 Oper: otAdd:-100,Left: 5, Right: -1
Push_5 Oper: otNext:-40,Left: 4, Right: -1
Push_6 Data: 4,Left: -1, Right: -1
Push_2 Oper: otMul:-200,Left: -1, Right: -1
Push_6 Data: 5,Left: -1, Right: -1
Pop__2 Data: 5,Left: -1, Right: -1
Pop__5 Oper: otMul:-200,Left: 9, Right: -1
Set__2 Oper: otMul:-200,Left: 9, Right: -1
Pop__2 Oper: otMul:-200,Left: 9, Right: -1
Pop__5 Oper: otNext:-40,Left: 8, Right: -1
Pop__2 Oper: otAdd:-100,Left: 5, Right: -1
Pop__3 Oper: otFun:-400,Left: 6, Right: -1
Call_1 Oper: otFun:-400,Left: 6, Right: -1
Set__1 Oper: otFun:-400,Left: 4, Right: -1
Pop__2 Oper: otFun:-400,Left: 4, Right: -1
Pop__5 Oper: otAssign:-20,Left: 2, Right: -1
Set__2 Oper: otAssign:-20,Left: 2, Right: -1
2004年10月19日 8:29:29
abc := fun1(2 + 3, 4 * 5, 6 - 7);
Data: 0: ,Left: 2, Right: -1
Data: 1: Var: abc,Left: -1, Right: -1
Oper: 2: otAssign,Left: 1, Right: 3
Oper: 3: otFun,fun1,Left: 5, Right: 7
Data: 4: 2,Left: -1, Right: -1
Oper: 5: otAdd,Left: 4, Right: 6
Data: 6: 3,Left: -1, Right: -1
Oper: 7: otNext,Left: 9, Right: 11
Data: 8: 4,Left: -1, Right: -1
Oper: 9: otMul,Left: 8, Right: 10
Data: 10: 5,Left: -1, Right: -1
Oper: 11: otNext,Left: 13, Right: -1
Data: 12: 6,Left: -1, Right: -1
Oper: 13: otSub,Left: 12, Right: 14
Data: 14: 7,Left: -1, Right: -1
Oper: 15: otRight,Left: -1, Right: -1
Oper: 16: otEnd,Left: -1, Right: -1
2004年10月19日 15:51:56
Root: [0] ,Left: 2,
解析和计算表达式,并以树状层次显示元素关系
4星 · 超过85%的资源 需积分: 50 136 浏览量
2006-01-13
09:51:35
上传
评论
收藏 318KB RAR 举报
普通网友
- 粉丝: 882
- 资源: 2万+