全球旧事资料 分类
值val。编译程序实现算术表达式、布尔表达式及程序语句的语义加工时,都是按这种状态栈加工方式进行的。
例如:536的分析过程
序号
STATE
Val
syl
i
put
1
0


536
2
02


536
3
023

5
36
4
026
5
E
36
5
0264
5
E
36
6
02643
5
E3
6
7
02647
53
EE
6
8
026
8
E
6
9
0269
8
E
6
10
01
8
E
6
11
015
8
E
6
12
0153
8
E6

13
0158
86
EE

14
01
48
E

15
ACC
在分析过程中,第(3)步操作后的状态栈为023,根据栈顶状态“3”和现行输入符号“”(i
put
栏字符串的第一个字符)查分析表ACTION3,R4,即按第(4)个产生式E→
来进行归约;由于产生式右部仅含一项,故去掉状态栈栈顶“3”;此时2变为新的栈顶状态,再查(2,E)的下一
状态s′:GOTO2E6,即将状态6和文法符号E压栈,最后得到第(4)步的状态。第(7)步操作后也是如此,当前状态栈为02647,根据栈顶状态7和现行输入符号“)”查分析表ACTION7,)R1,即按第(1)个产生式E→E1E2进行归约;由于产生式右部有三项,故去掉状态栈栈顶的647三项;此时2变为新的栈顶状态,再查(2,E)的下一状态s′:GOTO2,E6即将状态6和文法符号E压栈,最后得到第(8)步的状态。
三.中间代码生成器设计:
1.布尔表达式布尔表达式在程序语言中有两个基本作用:一是用作控制语句(如ifelse或while语句)的条
件式;二是用于逻辑演算,计算逻辑值。布尔表达式是由布尔算符(、、!)作用于布尔变量(或常数)或关系表达式而形成的。关系表达式的形式是E1ropE2,其中rop是关系符(如、≤、、≠、或≥),E1和E2是算术式。在这里,我们只考虑前面给定文法所产生的布尔表达式:B→BBBBBBiropii
遵照我们的约定,布尔算符的优先顺序(从高到低)为:、、,并假定和都服从左结
f合规则。所有关系符的优先级都是相同的,而且高于任何布尔算符,低于任何算术算符,关系算符不得结合。表达式的真、假出口的确定:考虑表达式B1B2,若B1为真,则立即知道B也为真;因此,B1的真出口也就是整个B的真出口。若B1为假,则B2必须被计值,B2的第一个四元式就是B1的假出口。当然,B2的真、假出口也就是整个B的真、假出口。类似的考虑适用于对B1B2的翻译,我们将B1B2和B1B2的翻译用下图表示,
在自下而上的分析过程中,一个布尔式的真假出口往往不能在产生四元式的同时就填上。我们只好把这种未完成的r
好听全球资料 返回顶部