资源描述:
《编译原理1.2-编译过程阶段》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.2编译过程概述逻辑阶段Phasessteps源程序目标程序词法分析语法分析语义分析中间代码生成代码优化目标代码生成表格管理出错处理例:position:=initial+rate*10以下从源程序在不同阶段所被转换成的表示形式来介绍各个阶段的任务词法分析Lexicalanalysis,Scanning字符流->单词流从左到右扫描,识别出单词单词,单词符号,符号,Token什么是单词逻辑上紧密相连的一组字符,这些字符具有集体含义。sequencesofcharactershavingcollectivemeaning.五类单词标识符保留字(关键字、基本字)常量(常数)运算符(算符
2、)界符position:=initial+rate*10单词类型单词值标识符(1)position算符(赋值号):=标识符(2)initial算符(加号)+标识符(3)rate算符(乘号)*整数10界符(分号);字符流->单词流position:=initial+rate*10;id1:=id2+id3*10<:=><+><*><10>词法分析程序的其他功能滤掉注释和空白提供出错的行号标记宏处理词法分析中的错误9position:=initial+rate*60;9,position,:=…<常数><标识符>:=…词法分析阶段,不会显示错误关于词
3、法分析词法分析程序的自动生成工具-LEX词法分析的依据-词法规则描述词法规则的工具正规式有限自动机2)语法分析Syntaxanalysis,Parsing单词流->语法短语检查源程序的结构是否符合语法规则语法短语,语法单位表达式,语句,函数,程序段,程序…position:=initial+rate*10;id1:=id2+id3*10分析树ParseTree赋值语句标识符表达式表达式表达式id1(position)id2(initial)id3(rate)10标识符标识符整数表达式表达式:=+*id1:=id2+id3*10语法树SyntaxTree词法分析和语法分析的界限词法结
4、构线性分析(LinearAnalysis)不需要递归语法结构层次分析(HierarchicalAnalysis)需要递归关于语法分析语法分析程序的自动生成工具-YACC语法分析的依据-语法规则描述语法规则的工具文法BNF范式(BACKUS-NAURFORM)3)语义分析Semanticanalysis对结构上正确的源程序审查有无语义错误静态语义类型匹配审查类型转换动态语义(运行语义,执行语义)例如数组越界、存储空间越界语法正确但语义错误-类型不匹配例1:intarr[2],b;b=arr*10;例2:Programp(input,output);Varrate:real;pro
5、cedureinitial;…position:=initial+rate*10例3:intarr[2],c;c=arr1*10;变量没有声明举例:符合语法规则但不符合语义规则使用没有声明的变量给一个过程名赋值调用函数时参数类型不合适实数用作数组下标参加运算的两个变量类型不匹配……Varrate:real;position:=initial+rate*10插入语义结点关于语义分析语义分析程序的自动生成工具-无语义分析的依据-语义规则描述语义规则的工具属性文法4)中间代码生成阶段IntermediateCodeGeneration中间语言,中间表示生成原则介于高级语言和低级语言之
6、间容易生成容易将它翻译成目标代码与目标机无关,便于优化、移植四元式、三元式、树结构P-code,C-code,Bytecode四元式(运算符,运算对象1,运算对象2,结果)(*,a,b,c)c=a*bposition:=initial+rate*10;id1:=id2+id3*10id1:=id2+id3*inttoreal(10)id1:=id2+id3*inttoreal(10)(op,arg1,arg2,result)问题:运算顺序是如何决定的?(1)(2)(3)(4)(inttoreal*+:=10id3id2t3-t1t2-t1)t2)t3)id1
7、)t1、t2、t3为临时工作单元也可以将四元式直接写成赋值的语句的形式例:a=b*c+b*d的四元式序列为:(1)t1=b*c(2)t2=b*d(3)t3=t1+t2(4)a=t3例:if(a<=b)a=a–c;c=b*c;翻译成四元式:t1=a>bift1gotoLt2=a–ca=t2L:t3=b*cc=t35)代码优化CodeOptimization中间代码优化目标代码优化(1)(2)(3)(4)(inttoreal*+:=10id3id2t3-t