状态 ACTION GOTO # E 01234 acc 6 r r r r 7 56789
状态 ACTION GOTO + * ( ) i # E 0 S2 S3 1 1 S4 S5 acc 2 S 2 S 3 6 3 r 4 r 4 r 4 r 4 4 S 2 S 3 7 5 S 2 S 3 8 6 S 4 S 5 S 9 7 r 1 S 5 r 1 r 1 8 r 2 r 2 r 2 r 2 9 r 3 r 3 r 3 r 3
要计算表达式的值,则需为每个产生式配上一个语义动 作,如: S→E print(E. val) E→E1+E2 E. val: =E. val+E, val E→E1E E. val: =E, val"E, val E→→(E1 E.val: =E1.val E一 E. val: =ilexval 下面分析识别7+9*5,并完成相应的语义动作。为减少归 约时的属性值拷贝,这里用属性栈记录属性,也就是用值栈 记录文法的属性值val。对于没有属性val的文法符号为直观 起见,用空表示。其中7、9、5为的显示值
要计算表达式的值,则需为每个产生式配上一个语义动 作,如: S'→E print(E.val) E→E1+E2 E.val:=E1 .val+E2 .val E→E1 *E2 E.val:=E1 .val*E2 .val E→(E1 ) E.val:=E1 .val E→i E.val:=i.lexval 下面分析识别7+9*5,并完成相应的语义动作。为减少归 约时的属性值拷贝,这里用属性栈记录属性,也就是用值栈 记录文法的属性值val。对于没有属性val的文法符号为直观 起见,用空表示。其中7、9、5为i的显示值
步骤归约动作状态栈语义栈(值栈)符号栈输入串 # 7+9*5 # 03 +9*5# 23456 01 777 +9*5# 014 #E+ 9*5# 0143 #E+i *5# 0147 E+E*5# 78 01475 E+E*5# 014753 #E+E*i# 014758 #E+E*E# 0147 745 #E+E# 11 01 52 12 acc(执行SE的语义动作,输出栈顶语义值52)
步骤 归约动作 状态栈 语义栈(值栈) 符号栈 输入串 1 0 _ # 7+9*5 # 2 03 _7 #i +9*5# 3 r 4 01 _7 #E +9*5# 4 014 _7_ #E+ 9*5# 5 0143 _7_9 #E+i *5# 6 r 4 0147 _7_9 #E+E *5# 7 01475 _7_9_ #E+E* 5# 8 014753 _7_9_5 #E+E*i # 9 r 4 014758 _7_9_5 #E+E*E # 10 r 2 0147 _7_45 #E+E # 11 r 1 01 _52 #E # 12 acc (执行S'→E的语义动作,输出栈顶语义值52)
为说明语法的制导翻译的翻译方法,在这里先讨论算术 表达式和简单赋值语句的制导翻译,其翻译成的中间代为逆 波兰式。这里介绍的仍是自底向上的分析技术,即在语法分 析中,当句柄归约时,就执行相应规则的语义处理子程序。 现在为了简单起见可以不关心采用何种自底向下的分析方法, 要关心所归约的句柄。 例:设有文法G[S] S→→A A→V:=E E→E+TT T→十FF F→(E)‖ 试用语法制制导翻译的方法为每个产生式配语义动作以 便将赋值语句翻译成相的逆波兰式
为说明语法的制导翻译的翻译方法,在这里先讨论算术 表达式和简单赋值语句的制导翻译,其翻译成的中间代为逆 波兰式。这里介绍的仍是自底向上的分析技术,即在语法分 析中,当句柄归约时,就执行相应规则的语义处理子程序。 现在为了简单起见可以不关心采用何种自底向下的分析方法, 只要关心所归约的句柄。 例:设有文法G[S]: S→A A→V:=E V→i E→E+T|T T→T*F|F F→(E)|i 试用语法制制导翻译的方法为每个产生式配语义动作以 便将赋值语句翻译成相的逆波兰式
设整个逆波兰式存放在P数组中,P数组的下标用变量p 指示,其初值为1,当归约某个非终结符时,则产生该非终 结符代表的逆波兰式。现考虑产生式F→和∨的语义子程 序,也就是将j约成∨或F时其中i是任一标识符或常量,那 么在逆波兰表示法中标识符和中缀式中的标识符应该是相同 的,也就是单个标识符的逆波兰式,即为标识符本身。故直 接输出标识符i可。在这里用 Lname表示i的名字。根据实 际情况,也可使用如:i在符号表中的入口、常量的显示值 等作为逆波兰式的运算对象。当用产生式TF归约时,由于 F的逆波兰式已经产生,而F的逆波兰式和T的逆波兰式是完 全相同的,即T的逆波兰式也已产生,故在该产生式的
设整个逆波兰式存放在P数组中,P数组的下标用变量p 指示,其初值为1,当归约某个非终结符时,则产生该非终 结符代表的逆波兰式。现考虑产生式F→i和V→i的语义子程 序,也就是将i归约成V或F时其中i是任一标识符或常量,那 么在逆波兰表示法中标识符和中缀式中的标识符应该是相同 的,也就是单个标识符的逆波兰式,即为标识符本身。故直 接输出标识符i即可。在这里用i.name表示i的名字。根据实 际情况,也可使用如:i 在符号表中的入口、常量的显示值 等作为逆波兰式的运算对象。当用产生式T→F归约时,由于 F的逆波兰式已经产生,而F的逆波兰式和T的逆波兰式是完 全相同的,即T的逆波兰式也已产生,故在该产生式的