第2章PL/0编译程序本章目的:以PL/0编译程序为实例,学习编译程序实现的基本步骤和相关技术1PL/0编译程序的结构2PL/0编译程序的分析工作(词法,语法和语义)实现3PL/0编译程序的错误处理方法4目标代码生成和类pcode代码解释器1.PL/0编译程序的结构PL/0编译程序PL/0语言程序类p-code代码源语言(PL/0)目标语言(类p-code)实现语言(pascal/C)PL/0类p-codepascal/CPL/0编译程序类p-code解释程序类p-code代码PL/0源程序输入数据输出数据PL/0编译系统的结构框架PL/0语言PL/0语言:PASCAL语言的子集PL/0程序示例PL/0的语法描述图PL/0语言的EBNF表示PL/0程序示例CONSTA=10;(*常量说明部分*)VARB,C;(*变量说明部分*)PROCEDUREP;(*过程说明部分*)VARD;(*P的局部变量说明部分*)PROCEDUREQ;(*P的局部过程说明部分*)VARX;BEGINREAD(X);D:=X;WHILEX#0DOCALLP;END;BEGINWRITE(D);CALLQ;END;BEGINCALLP;END.Q过程体p过程体主程序体输入圆柱的半径和高,计算一些面积、体积等varr,h,len,a1,a2,volumn;beginread(r);read(h);len:=2*3*r;a1:=3*r*r;a2:=a1+a1+len*h;volumn:=a1*h;write(len);write(a1);write(a2);write(volumn);end.计算最大公约数varm,n,r,q;{计算m和n的最大公约数}proceduregcd;beginwhiler#0dobeginq:=m/n;r:=m-q*n;m:=n;n:=r;endend;beginread(m);read(n);{为了方便,规定m>=n}ifm0thenbeginfact:=fact*m;m:=m-1;callfactorial;end;end;begin{读入n}read(n);sum:=0;whilen>0dobeginm:=n;fact:=1;callfactorial;sum:=sum+fact;n:=n-1;end;{输出n!}write(sum);end.程序分程序.内的文字表示语法成分(短语)或内的文字表示单词符号程序.内的文字表示语法成分(短语)语法图constidentnumber=,;varident,;;procedureident;分程序语句分程序PL/0语言的EBNF表示构成EBNF的元素—(非终结符,终结符,开始符,规则)EBNF的元符号:<>用左右尖括号括起来的内容为非终结符∷=读做‘定义为’∷=的左部...