- 1
- 0
- 约6.54千字
- 约 80页
- 2022-10-27 发布于上海
- 举报
会计学;目标程序;3;4;5;6;7;属性文法的形式定义
一个属性文法是一个三元组,A=(G, V, F)
G是一个上下文无关文法;
V是属性的有穷集;
F是关于属性的断言的有穷集。
说明:
每个属性与文法符号相联,N.t表示文法符号N的属性t。属性值又称语义值。存储属性值的变量又称语义变量。
每个断言与文法的某个产生式相联,写在{ }内。属性的断言又称语义规则,它所描述的工作可以包括属性计算、静态语义检查、符号表的操作、代码生成等,有时写成函数或过程段。;9;10;11;例 简单算术表达式求值的属性???法
L→E { Print(E.val) }
E→E1+T { E.val :=E1.val +T.val }
E→T { E.val :=T.val }
T→T1*F { T.val :=T1.val * F.val }
T→F { T.val :=F.val }
F→(E) { F.val :=E.val }
F→digit { F.val :=digit.lexval }?;例 描述变量类型说明的属性文法
D→TL { L.in:=T.type }
T→int { T.type:=int }
T→real { T.type:=real }
L→L1,id { L1.in:=L.in;
addtype( id.entry,L.in )}
L→id { addtype( id.entry,L.in )} ;14;例 简单算术表达式求值的属性文法
E→E1+T { E.val :=E1.val +T.val }
E→T { E.val :=T.val }
T→T1*digit { T.val :=T1.val * digit.lexval }
T→digit { T.val :=digit.lexval }?;语法制导翻译的实现途径
以自下而上( LR分析)的语法制导翻译来说明
将LR分析器能力扩大,增加在归约后调用语义规则的功能
增加语义栈,语义值放到与符号栈同步操作的语义栈中,多项语义值可设多个语义栈 ,栈结构为:;例 简单算术表达式求值的属性文法
L →E
{print(E.val)}
E→E1+T
{ E.val :=E1.val +T.val }
E→T
{ E.val :=T.val }
T→T1*digit
{ T.val :=T1.val * digit.lexval }
T→digit
{ T.val :=digit.lexval }?;步骤;19;20;后缀式的计算机处理
后缀式的最大优点是易于计算机处理
处理过程:
从左到右扫描后缀式,每碰到运算对象就推进栈;碰到运算符就从栈顶弹出相应目数的运算对象施加运算,并把结果推进栈。最后的结果留在栈顶。? ;逆波兰表示法的扩充
逆波兰表示法很容易扩充到表达式以外的范围
例如:;23;24;25;26;四元式的另一种表示
有时为了更直观,把四元式写成简单赋值形式或更易理解的形式;28;29;1.属性和语义规则中用到的变量、过程和函数
属性:
用id.name表示单词id的名字。
用E.place表示存放E值的变量名在符号表的入口地址或临时变量编码。
变量、函数和过程:
用nextstat变量给出在输出序列中下一个四元式的序号
用lookup(id.name)函数审查id.name是否出现在符号表中,是则返回id的入口地址,否则返回nil。
用emit过程向输出序列输出一个四元式,emit每调用一次,nextstat的值增加1
用newtemp函数生成临时变量,每次调用生成一个新的临时变量,如t1, t2 , ……
用error过程进行错误处理。 ;S→id:=E
{ p:=lookup ( id.name ) ;
if p≠nil then emit (:=, E.place , - , p )
else error };E→-E1
{ E.place:=newtemp ;
emit ( @ , E1.place , - , E.place ) };例 翻译赋值语句A:=B+C ;表达式中可能出现不同类型的变量和常量
语义审查包括:
每个使用性标识符是否都有声明?
运算符的分量类型是否相容?
若不接受不同类型的运算对象混合运算,则应指出错误;
若接受混合运算则要进行类型转换处理。
例 :假定表达式可以有混合运算,id可以是整型和实型,且当两个不同类型的id进行运算时先把整型id转换成实型,再进行运算。
用E.type表示E的类型信息,其值为int或real。
用 +i , *i 表示整型运算,用 +r , *r 表示实型运算。
用一目算符 itr 表示将整型量转换成实型量
原创力文档

文档评论(0)