整套课件:编译原理(北京工业大学).ppt

* * 1. 语义分析的任务 语义检查 例如:类型、运算、维数、越界 语义处理 例如:变量的存储分配、表达式的求值、语句的翻译(中间代码的生成) 总目标 生成等价的中间代码 * * 2. 代码结构 朴素理解:我们编写的程序在如何工作? 计算学科:对信息(数据表示)描述和变换算法的系统研究 变换:源、目标以及源与目标的对应关系 语句的代码结构(源、目标) 语句分类 说明语句——符号表的查填 可执行语句——生成指令代码 * * 3. 典型处理方法 对应每一个产生式编制一个语义子程序,当一个产生式获得匹配时,调用相应的语义子程序实现语义检查与翻译 E→E1 + T E.val:=E1.val+T.val T→T1 * F T.val:=T1.val*F.val F →id F.val:=id.val 适应在完成归约的时候进行 语义——可以看成是相应文法符号的属性 * * 3. 典型处理方法 在产生式的右部的适当位置,插入相应的语义动作,按照分析的进程,执行遇到的语义动作 D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in }L1,id{…} 语义——可以看成是相应文法符号的属性 适应在进行推导时完成 对应语法基本分析方法(Top-down、Bottom-up) * * 6.2 属性(Attribute)文法 属性文法是Knuth在1968年提出的 属性文法的特点 是一种接近形式化的语义描述方法 长于描述静态语义、短于描述动态语义 每个语法符号有相应的属性符号 每个产生式有相应的计算属性的规则 属性变量:=属性表达式 * * 属性文法举例 产生式 属性(计算)规则/语义规则 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 →id E.val := id .val * * 1. 属性文法的定义 三元组:A=(G,V,F) G 是上下文无关文法 V 属性的有穷集 F 关于属性的计算规则 属性及其计算规则 语义信息作为终结符和非终结符的属性 语义分析为产生式相关的属性计算:每个产生式设置语义规则,描述各属性的关系——计算规则 * * 2. 属性的设定 根据文法符号的语义,为文法符号设置属性,用来表示文法符号的语义 终结符使用单词的属性 (id.val) 保留字:if, begin, function,…… 常数:40.12, 232, 80, “TCP/IP” 标识符:sum, tcc, id 语法变量根据实际需要设定属性 表达式E:E.type, E.val * * 例6-1 计算器的属性文法 L → E E → E1 + T | T T → T1 * F | F F → ( E ) | digit 任务: 完成一个输入表达式值的计算和显示——翻译 ??如何描述翻译过程 用文法描述要完成的动作 * * 例6-1 计算器的属性文法(续) L → E print( E.val )(L的虚属性) 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 lexval 是单词 digit 的属性 * * 例6-2 说明语句的属性文法 说明语句的文法 D → T L T → int T → real L → L1,id L → id 要解决的问题: 纪录标识符的类型 类型信息传递 方法:用T.type记录类型信息,并传给L.in real operand,text,sum int add, sub,mult * * 例6-2 说明语句的属性文法 D → T L L.in := T.type T → int T.type := ‘integer’ T → real T.type := ‘real’ L → L1,id L1.in := L.in addtype( id.entry, L.in ) L → id addtype( id.entry, L.in )

文档评论(0)

1亿VIP精品文档

相关文档