编译逻辑过程词法分析语法分析语义分析中间代码生成代码优化目标代码生成词法分析•功能词法分析•从左至右读字符流的源程序、识别(拼)单词词法分析position:=initial+rate*60;单词类型单词值标识符1(id1)position算符(赋值):=标识符2(id2)initial算符(加)+标识符3(id3)rate算符(乘)*整数60分号;又如一个C源程序片断:inta;a=a+2;词法分析后可能返回:单词类型单词值保留字int标识符(变量名)a界符;标识符(变量名)a算符(赋值)=标识符(变量名)a算符(加)+整数2界符;语法分析•功能:语法分析•功能:层次分析.依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树).语法分析•功能:层次分析.依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树).规则<赋值语句>::=<标识符>“:=”<表达式><表达式>::=<表达式>“+”<表达式><表达式>::=<表达式>“*”<表达式><表达式>::=“(”<表达式>“)”<表达式>::=<标识符><表达式>::=<整数><表达式>::=<实数>如:position:=initial+rate*60;position+initial:=rate*60position:=initial+rate*60赋值语句标识符表达式表达式+表达式表达式标识符整数标识符:=表达式*id1:=id2+id3*N:=+N60*id1Positionid2initialid3rate语义分析语义审查(静态语义)语义分析语义审查(静态语义)–上下文相关性–类型匹配–类型转换例:Programp();Varrate:real;procedureinitial;…position:=initial+rate*60语义分析语义审查(静态语义)–上下文相关性–类型匹配–类型转换例:Programp();Varrate:real;procedureinitial;…position:=initial+rate*60/*error*//*error*//*warning*/;…Programp();Varrate:real;Varinitial:real;Varposition:real;…position:=initial+rate*60•/*warning*/•position:=initial+rate*60.00语义分析60:=+*Id1positionId2initialId3rateinttoreal中间代码(中间表示)生成源程序的内部(中间)表示三元式、四元式、P-Code、C-Code、U-Code、bytecode(*id3t1t2)t2=id3*t1t2:=id3*t1id1:=id2+id3*60id1:=id2+id3*60(1)(inttoreal,60-t1)(2)(*,id3t1t2)(3)(+,id2t2t3)(4)(:=,t3-id1)代码优化id1:=id2+id3*60(1)(inttoreal60-t1)(2)(*id3t1t2)(3)(+id2t2t3)(4)(:=t3-id1)变换代码优化id1:=id2+id3*60(1)(inttoreal60-t1)(2)(*id3t1t2)(3)(+id2t2t3)(4)(:=t3-id1)变换(1)(*id360.0t1)(2)(+id2t1id1)代码优化t1=b*ct2=t1+0t3=b*ct4=t2+t3a=t4代码优化t1=b*ct1=b*ct2=t1+0t2=t1+t1t3=b*ca=t2t4=t2+t3a=t4目标代码生成(*,id360.0t1)(+,id2t1id1)movfid3,R2mulf#60.0,R2movfid2,R1addfR2,R1movfR1,id1对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成、优化、)报告的。•else没有匹配的if;•声明和使用的函数没有定义;•不能构成任何单词的字符;•数的数字字符个数太多;•数组下标越界;