PL0编译原理课程设计

上传人:ba****u6 文档编号:158501853 上传时间:2022-10-05 格式:DOCX 页数:26 大小:408.86KB
收藏 版权申诉 举报 下载
PL0编译原理课程设计_第1页
第1页 / 共26页
PL0编译原理课程设计_第2页
第2页 / 共26页
PL0编译原理课程设计_第3页
第3页 / 共26页
资源描述:

《PL0编译原理课程设计》由会员分享,可在线阅读,更多相关《PL0编译原理课程设计(26页珍藏版)》请在装配图网上搜索。

1、课程名称 编译原理题目名称_编译原理课程设计学生学院计算机学院专业班级_ 09级计科5班 _ 学 号 3109006080学生姓名何路生指导教师张巍2011 年12 月29 日一课程设计目的在分析理解一个教学型编译程序(如PL/0 )的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。达到进一步了解程序编译过程的基本原理和基本实现方法的目的。二课程设计要求课内实验:对 PL/0 作以下修改扩充:(1) 增加单词:保留字 ELSE,FOR,STEP,UNTIL,RETURN 运算符 +=, -=, +, -,A,V,n(2) 修改单词:不等号# 改为 (3) 增加条件语句的E

2、LSE子句,要求:写出相关文法,语法图,语义规则。 课程设计:基本内容(成绩范围:“中”、“及格”或“不及格”)( 1)扩充赋值运算: += 和 -=(2)扩充语句(Pascal的FOR语句):FOR 变量 := 表达式STEP 表达式U NTIL 表达式DO 语句( 3)增加运算: + 和 -。选做内容(成绩评定范围扩大到:“优”和“良”)(1) 增加类型:字符类型;实数类型。(2) 扩充函数:有返回值和返回语句;有参数函数。(3) 增加一维数组类型(可增加指令)。(4) 其他典型语言设施。三课程设计环境与工具(1) 计算机及操作系统:PC机,Windows7(2) 实现工具:C+Build

3、er6(3) 教学型编译程序:PL/0四结构设计说明a) PL/0 编译程序的结构图b) PL/0 编译程序的过程或函数的功能表1、 void Error(int n) :错误处理,打印出错位置和错误编码2、void GetCh():漏掉空格,读取一个字符3、void GetSym():词法分析,读取一个单词4、void GEN(FCT X, int Y int Z):生成目标代码,并送入目标程序区5、void TEST(SYMSET S1, SYMSET S2, int N):测试当前单词符号是否合法6、void ENTER(OBJECTS K, int LEV, int &TX, int

4、&DX)登录名字表7、int POSITION(ALFA ID, int TX)查找标识符在名字表中的位置8、void ConstDeclaration(int LEV,int &TX,int &DX)常量说明处理9、void VarDeclaration(int LEV,int &TX,int &DX) 变量说明处理10、void CharDeclaration(int LEV,int &TX,int &DX)字符说明处理11、void RealDeclaration(int LEV,int &TX,int &DX) 实数说明处理12、void ListCode(int CX0) 列出目标代

5、码清单13、void FACTOR(SYMSET FSYS, int LEV, int &TX) 因子处理14、void TERM(SYMSET FSYS, int LEV, int &TX) 项处理15、void EXPRESSION(SYMSET FSYS, int LEV, int &TX) 表达式处理16、void CONDITION(SYMSET FSYS,int LEV,int &TX) 条件处理17、void STATEMENT(SYMSET FSYS,int LEV,int &TX) 语句部分处理18、void Block(int LEV, int TX, SYMSET FSY

6、S) 分程序分析处理过程19、int BASE(int L,int B,int S) 通过静态链求出数据区的基地址20、void Interpret() 对目标代码的解释执行程序21、void _fastcall TForml:ButtonRunClick(TObject *Sender) 进行编译,RUNc) PL/0 编译程序的总体流程图d) 词法分析词法分析是编译的第一个阶段,它的主要任务是从左向右逐个字符地对源程 序进行扫描,产生一个个单词序列用于语法分析。PL/0词法分析程序GETSYM的 功能是为语法分析提供单词用的,是语法分析的基础,把输入的字符串形式的源 程序分割成一个个单词符

7、号。经过词法分析程序分析出来的单词,对语言固有的 单词只给出类别存放在全程变量SYM中,而对用户定义的单词(标识符或常数) 既给出类别又给值,其类别放在SYM中,值放在全程变量ID或全程变量NUM 中, 全部单词种类由编译程序定义的纯量类型SYMBOL给出,称为语法词汇表。词法分析程序GETSYM将完成下列任务:(1)滤空格(2)识别保留字(3)识别标识符(4)拼数(5)拼复合词(6)输出源程序e)语法分析PL/0 编译程序的语法分析采用了自顶向下的递归的子程序法。语法分析同 时也根据程序的语义生成相应三元代码,并提供了出错处理的机制。语法分析主 要由分程序分析过程(BLOCK)、常量定义分析

8、过程(ConstDeclaration)、变量 定义分析过程(Vardeclaration)、语句分析过程(Statement)、表达式处理过 程(Expression)、项处理过程(Term)、因子处理过程(Factor)和条件处理过 程(Condition)构成。这些过程在结构上构成一个嵌套的层次结构。f)语义分析PL/0 的语义分析主要进行以下检查:(1)是否存在标识符先引用未声明的情况;(2)是否存在己声明的标识符的错误引用;(3)是否存在一般标识符的多重声明。g)中间代码生成LIT 0 a骆常数值取到栈顶,翁为常数值LOD 1 a将变蚩值取到栈顶.乱为相对运行栈基址的偏移量1为层差S

9、TO 1 a将栈顶内容送入某变屋单元中,已为相对运行栈基址偏移量.1为建CAL 1 a调用过程,a为过程入口地址,1为层差I NT 0 a在运行栈中为被调用的过程开辟乱个单元的数据区JMP 0 a无条件跳转至已地址J PC 0 a条杵跳转,当栈顶布尔值非真则跳转至a地址,否则撷序执行OPR 0 0过程调用结束店,返回调用点井退栈OPR 0 1桟顶元素取反OPR 0 2喪栈顶与栈顶相加,退两个栈元蕭,结果值进找OPR 0 3次栈顶减去栈顶,退两个栈元素,结果值进栈OPR 0 1次栈顶乘以栈顶,退两个栈元素,结果值进栈OPR 0 5次栈顶除以栈顶,退两个栈元素,结果值进栈OPR 0 6栈顶元素的奇

10、偶判断,结果值在栈顶OPR C 7OPR 0 8次栈顶与栈顶是否相等,退两个栈元素,结果值进栈OPR 0 9次栈顶与栈顶是否不等,退两个栈兀素结果值进栈OPR 0 10次栈顶是否小于栈顶、退两个栈元素,结果值迸栈OPR 0 11次栈顶是否大于等于栈顶,退两个桟无素结果值进栈OPR 0 12次栈顶是否大于栈顶,追两个栈元素,结果值进栈OPR 0 13次栈顶是否小于等于桟顶,退两个找元素.结果值进栈OPR 0 14栈顶值输出至屛幕(字符型)OPR 0 15栈项值输出至屏幕(整数型)OPR 0 16栈顶值输出至屏幕(实数型) “OPR 0 17屏幕输出换行OPR 0 18从命令行读入一个字符输入置于

11、栈顶OPR 0 19从命令行读入一个整数输入置于栈顶OPR 0 20从命令行读入一个整数输入置于栈顶h)语法错误处理PL/0编译程序对语法错误的处理采用两种办法:(1)对于一些易于校正的错误,如丢了逗号、分号等,指出出错的位置, 加以校正,继续进行分析。(2)对于难于校正的错误,给出错误的位置与性质,跳过后面一些单词, 直到下一个可以进行正常语法分析的语法单位。错误类型如下0过程开始部分说明不正确1常数说明中二写成:=2常数说明中二后应为整数或实数或字符常数说明中的标识符后应是=const, var, procedure 后应为标识符漏掉了,或;6 过程说明后的符号不正确(应该是语句开始符,或

12、过程定义符)7 应是语句开始符8 程序体内语句部分的后跟符不正确9 程序结尾丢了句号.10语句间漏了;11标识符未说明12赋值语句中,赋值号左部标识符属性应是变量 13变量后不能是此符号14 call后应为标识符15 call后标识符属性应为过程16条件语句中丢了then17 丢了end或;18 while型循环语句丢了do19语句后的符号不正确20应为关系运算符21表达式内标识符属性不能是过程22表达式中漏掉右括号(23因子后的非法符号 24表达式的开始符不能是此符号31数越界五设计过程(一)课内实验内容(1)增加单词:保留字 ELSE(ELSESYM),FOR(FORSYM),STEP(S

13、TEPSYM), UNTIL(UNTILSYM),RETURN(SYM)运算符 +=(ADDEQUALSYM), -=(MINUSEQUALSYM), +(INCSYM), -(DECSYM),人 (ANDSYM),V(ORSYM),(NOTSYM)typedef enum NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM, TH

14、ENSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM ,ELSESYM , FORSYM,STEPSYM,UNTILSYM,RETURNSYM , ANDSYM,ORSYM,NOTSYM,LESSTHAN,MORETHAN,ADDEQUALSYM,MINUSEQUALSYM,INCSYM,DECSYM,CHARSYM,INTSYM,REALSYM,OFSYM SYMBOL; /51char *SYMOUT = NUL, IDENT, NUMBER, PLUS, MINUS,

15、TIMES,SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ,LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD,BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM,WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM,CONSTSYM, VARSYM, PROCSYM, PROGSYM ,ELSESYM,FORSYM,STEPSYM,UNTILSYM,RETURNSYM, ANDSYM,ORSYM,NOTSYM,LESSTHAN,MORETHAN ADDEQU

16、AL,MINUSEQUAL,INC,DEC,CHARSYM,INTSYM,REALSYM, OFSYM;其中黑斜体为新加入的 SYMBOL。再将上述黑斜体关键字加到KWORD和将相应的SYM加到WSYM,按字母顺序排列void _fastcall TForm1:ButtonRunClick(TObject *Sender) for (CH= ; CHv=a; CH+) SSYMCH=NUL;strcpy(KWORD 1,ADDEQUAL);strcpy(KWORD 2,BEGIN);strcpy(KWORD 3,CALL);strcpy(KWORD4,CHAR); strcpy(KWORD5,

17、CONST);strcpy(KWORD6,DEC);strcpy(KWORD 7,DO); strcpy(KWORD 8,ELSE); strcpy(KWORD 9,END);strcpy(KWORD 10,FOR);strcpy(KWORD 11,IF);strcpy(KWORD 12,INC); strcpy(KWORD13,INT);strcpy(KWORD 14,MINUSEQUAL);strcpy(KWORD 15,ODD); strcpy(KWORD 16,PROCEDURE); strcpy(KWORD 17,PROGRAM); strcpy(KWORD18,READ); str

18、cpy(KWORD19,REAL);strcpy(KWORD 20,RETURN);strcpy(KWORD 21,STEP);strcpy(KWORD22,THEN); strcpy(KWORD23,UNTIL);strcpy(KWORD24,VAR);strcpy(KWORD25,WHILE);strcpy(KWORD26,WRITE); /添加了 保留字 ELSE,FOR, STEP, UNTIL, RETURN ,CHAR ,INT , REALWSYM 1=ADDEQUALSYM;WSYM 2=BEGINSYM;WSYM 3=CALLSYM;WSYM 4=CHARSYM;WSYM 5

19、=CONSTSYM;WSYM 6=DECSYM;WSYM 7=DOSYM;WSYM 8=ELSESYM; WSYM 9=ENDSYM;WSYM 10=FORSYM;WSYM11=IFSYM;WSYM 12=INCSYM;WSYM 13=INTSYM;WSYM 14=MINUSEQUALSYM;WSYM 15=ODDSYM;WSYM 16=PROCSYM;WSYM 17=PROGSYM; WSYM18=READSYM;WSYM19=REALSYM;WSYM 20=RETURNSYM; WSYM21=STEPSYM;WSYM22=THENSYM; WSYM 23=UNTILSYM;WSYM24=V

20、ARSYM; WSYM25=WHILESYM;WSYM26=WRITESYM;SSYM+=PLUS;SSYM-=MINUS;SSYM*=TIMES;SSYM/=SLASH;SSYM(=LPAREN;SSYM)=RPAREN;SSYM=EQL;SSYM,=COMMA;SSYM.=PERIOD;SSYM#=NEQ;SSYM;=SEMICOLON; SSYM=MORETHAN;SSYM&=ANDSYM; SSYM|=ORSYM;SSYM!=NOTSYM; (二)课程设计内容1.增加运算符+=,-=,+,-a) 词法分析在 GetSym ()中完成 INC(+ +)、DEC(- -)、ADDEQUAL

21、(+=)、MINUSEQUAL(-=)的词法分析,代码修改如下:/GetSym()增加功能-else if(CH =+) GetCh();if(CH = =)/增加+=SYM = ADDEQUALSYM;GetCh();else if(CH = +)/增加+SYM = INCSYM;GetCh(); else SYM = PLUS;else if(CH = -) GetCh();if(CH = =)/增加-=SYM = MINUSEQUALSYM;GetCh();else if(CH = -)/增加-SYM = DECSYM;GetCh();else SYM = MINUS;else SYM=

22、SSYMCH; GetCh(); b) 后+ +和后- -的实现图1根据以上语法图,我们只要对语句处理程序和因子处理程序进行修改添加,即可 实现增加 后INC和 后DEC操作,首先对语句处理程序STATEMENT进行如下修 改:根据以上语法图,我们只要对语句处理程序和因子处理程序进行修改添加,即可 实现增加 后INC和 后DEC操作,首先对语句处理程序STATEMENT进行如下修 改:根据以上语法图,我们只要对语句处理程序和因子处理程序进行修改添加,即可实现增加后 INC和 后DEC操作,首先对语句处理程序STATEMENT进行如下修改:/后的+ -case IDENT:else if (SY

23、M=INCSYM) /语句中的+运算 if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GEN(LIT,O,1);GEN(OPR,0,2);if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym();else if (SYM=DECSYM) /语句中的运算 if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GEN (LIT,0,1);GEN (OPR,0,3);if (i!=0) GEN(STO,LEV-TABLEi.v

24、p.LEVEL,TABLEi.vp.ADR);GetSym ();break;在接受到SYM=IDENT后,如果SYM为INC,则主要执行这四条指令: GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR)将 IDENT 的值放到栈顶, GEN(LIT,0,1);将常数1放到栈顶,GEN(OPR,0,2)次栈顶加栈顶,GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR)将栈顶内容保存到 IDENT 中。这样 就完成了语句中的+运算。如果SYM为DEC,则主要执行这四条指令:GEN(LOD,LEV-TABLEi.vp.LEVEL,TA

25、BLEi.vp.ADR)将 IDENT 的值放到栈顶, GEN(LIT,0,1); 将常数1 放到栈顶,GEN(OPR,0,3) 次栈顶减栈顶,GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR)将栈顶内容保存到 IDENT 中。这样 就完成了语句中的-运算。其次,再对因子处理程序FACTOR修改如下: if(SYM=INCSYM|SYM=DECSYM) /因子中的+和-运算 count.length+; count.idcount.length=i;GEN(LIT,0,1); if(SYM=INCSYM) GEN(OPR,0,2);count.icount.l

26、ength=1;GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/将栈顶送入变 量单元GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /将/ 变量送入栈顶 GEN(LIT,0,-1); GEN(OPR,0,2);如果为INC,则加1else GEN(OPR,0,3);count.icount.length=-1;GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/将栈顶送 入变量单元GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /将/ 变量

27、送入栈顶 GEN(LIT,0,1);GEN(OPR,0,2);/否则减一对后+和后的处理思想是,在表达式中不进行自加/自减操作,但在送往变量的时候进行 c) 前+和前-的实现语法树:根据以上语法图,我们只要对语句处理程序和因子处理程序进行修改添加,即可实现增加 前INC和 前DEC操作,首先对语句处理程序STATEMENT进行如下修改:/ 前的+-case INCSYM:/前+GetSym();if (SYM = IDENT) i=POSITION(ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO

28、 NON-VARIABLE*/Error(12); i=0;if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,2);if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym();else Error(45);break;case DECSYM:/前-GetSym();if (SYM = IDENT) i=POSITION(ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIAB

29、LE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0;if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN (LIT,0,1);GEN (OPR,0,3);if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym ();else Error(45);break;再对因子处理,对于前+、前-,只在 EXPRESSION 中处理,因子部分只处理后+、后 操作GetSym();if (SYM = IDENT) i=POSITION(

30、ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0;if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,2); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); / 将栈 顶送入变量单元GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /将变 量送

31、入栈顶 GetSym();else Error(45);else if(SYM = DECSYM) /前-GetSym();if (SYM = IDENT) i=POSITION(ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0;if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN (LIT,0,1);GEN (OPR,0,3); if (i!=0) GEN(STO,LEV-TA

32、BLEi.vp.LEVEL,TABLEi.vp.ADR); / 将栈 顶送入变量单元GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /将变 量送入栈顶GetSym ();else Error(45);d) 扩充+=和-=操作语法树:语句根据图3,在语句处理STATEMENT中,在已经处理INC和DEC的基础上,添加对ADDEQUAL (+=)运算和MINUSEQUAL (-=)运算的扩充,相关代码添加如下:case IDENT:else if (SYM=ADDEQUALSYM) /增加运算符+=if (i!=0) GEN(LOD,LEV-TABLEi.v

33、p.LEVEL,TABLEi.vp.ADR);GetSym();EXPRESSION(FSYS,LEVTX);GEN(OPR,0,2);if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);else if (SYM=MINUSEQUALSYM) /增加运算符-=if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym();EXPRESSION(FSYS,LEV,TX);GEN(OPR,0,3);if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLE

34、i.vp.ADR); break;2.增加Pascal的FOR语句:/添加FOR功能case FORSYM:GetSym();if(SYM != IDENT) Error(47);else i=POSITION(ID,TX);if(i = 0) Error(ll);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TONON-VARIABLE*/Error(12); i=0;GetSym();if(SYM = BECOMES) GetSym();else Error(13);EXPRESSION(SymSetUnion(SymSetNew(STEPSYM

35、),FSYS),LEV,TX);if(i != 0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /把/ 栈顶 的值送到变量/ GetSym(); if(SYM=STEPSYM) GetSym(); else Error(46);CX1=CX;GEN(JMP,0,0);CX3=CX;EXPRESSION(SymSetUnion(SymSetNew(UNTILSYM),FSYS),LEV,TX);GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); 将变量 送回栈顶GEN(OPR,0,2); GEN(STO,LEV-T

36、ABLEi.vp.LEVEL,TABLEi.vp.ADR);/把 栈顶的值送到变量/ GetSym(); if(SYM=UNTILSYM) GetSym(); else Error(47);CODECX1.A=CX; EXPRESSION(SymSetUnion(SymSetNew(DOSYM),FSYS),LEV,TX);/终止条件GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /将变量 送回栈顶GEN(OPR,0,11); CX2=CX;GEN(JPC,0,0);/ GetSym(); if(SYM=DOSYM) GetSym();else Erro

37、r(48);STATEMENT(FSYS,LEV,TX); GEN(JMP,0,CX3);CODECX2.A=CX;FOR语句扩充完毕。3.增加类型:字符类型和实数类型typedef enum CHARCON, INTCON, REALCON, NOTYP TYPES; /类型TYPES TY; /记录类型struct ALFA NAME;OBJECTS KIND;TYPES TYPE; /增加类型union float VAL; /*CONSTANT*/ /统一用浮点型记录struct int LEVEL,ADR,SIZE; vp;/*VARIABLE,PROCEDUR: 层次、地址、存储空

38、间*/; TABLETXMAX;在 SYMBOL 中加入 REALSYM, INTSYM, CHARSYM, OFSYM对应的 SYMMAX=52 ;N0RW=26;增加实数和字符词法分析else /加入浮点数读入if (CH=0 & CH=0 & CH=0 & CHNMAX) Error(30);else/加入字符类型只接受 a 里面的一个字母if(int)CH=39)SYM = CONSTSYM;GetCh();if(CH=A & CH=a & CHprintcs(char)ST); fprintf(FOUT,%cn,(char)ST);T-;break;case 15: /整数输出For

39、m1-printls(,ST); fprintf(FOUT,%dn,(int)ST);T-;break;case 16: /实数输出Form1-printrs(,ST);fprintf(FOUT,%.4fn,ST);T-;break;case 17:break;case 18:/输入字符T+;ST=InputBox(输入,请输入一个字符:”0).ToDouble();Form1-printcs(?);Form1-printcs(char)ST);fprintf(FOUT,? %cn,(char)ST);break;case 19: /输入整型T+;ST=InputBox(输入,请输入整数:”0

40、).ToDouble();while(ST-(int)ST)!=0) ST=InputBox( 输 入 , 请 输 入 整 数 :0).ToDouble();,ST);Form1-printrs(? fprintf(FOUT,? %fn,ST);break;case 20: /输入实数T+;ST=InputBox(输 入,请输入 实数:,0).ToDouble();Form1-printrs(?,ST);fprintf(FOUT,? %fn,ST);break;语法语义分析void STATEMENT(SYMSET FSYS,int LEV,int &TX) /*STATEMENT*/ cas

41、e READSYM:GetSym();if (SYM!=LPAREN) Error(34);elsedo GetSym();if (SYM=IDENT) i=POSITION(ID,TX);else i=0;if (i=0) Error(35);else switch(TABLEi.KIND)case CHARCON: GEN(OPR,0,18);break;case INTCON: GEN(OPR,0,19);break;case REALCON: GEN(OPR,0,20);break;GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym()

42、; while(SYM=COMMA);if (SYM!=RPAREN) Error(33);while (!SymIn(SYM,FSYS) GetSym();else GetSym();break; /* READSYM */case WRITESYM:GetSym();if (SYM=LPAREN) do GetSym();if (SYM=IDENT) i=POSITION(ID,TX);else i=0;if(i!=0)/ TY = TABLEi.KIND;EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX); switc

43、h(TABLEi.KIND) /输出处理 case CHARCON:GEN(OPR,0,14);break;case INTCON:GEN(OPR,0,15);break;case REALCON:GEN(OPR,0,16);break;else Error(35);while(SYM=COMMA);if (SYM!=RPAREN) Error(33);else GetSym();GEN(OPR,0,17);break; /*WRITESYM*/ /*STATEMENT*/ 变量定义void CharDeclaration(int LEV,int &TX,int &DX) /声明if (SYM

44、=IDENT) ENTER(CHARCON,LEV,TX,DX); GetSym(); else Error(4); /*CharDeclaration()*/void RealDeclaration(int LEV,int & TX,int & DX) 声明if (SYM=IDENT) ENTER(REALCON,LEV,TX,DX); GetSym(); else Error(4); /*RealDeclaration()*/六运行界面七调试测试+,-的测试,测试文件testl.plOPROGRAM EX01;VAR AZB,C;BEGINA:=88;READ (B);+A;WRITE (

45、A);-A;WRITE (A);C : =A+B* (3+B);WRITE(C+);WRITE(C); END.源程序名E01目标代码a不显示RUNRUN PLO询计科彌何路主20113M2月巧日 芸成诅i丈时胃知11狂Y月为曰00124610131720283746+=,-=的测试,测试文件test2.pl0* PL/O Compiler Demo * =COMPILE PLO =0 PROGRAM EX01;0 VAR AB.C;1 BEGIN源程序名E012681215A:=88;C:=3; READ(B); C+-B;WRITE(C); END.RUN PLO 目标代码显示囲不显示RU

46、N幽科弓址河3生2011121502(m年i胡匹|日FOR功能的测试,测试文件test4.pl0614FOR 工:=1 STEP 1 UNTIL 5 DO源程序名FOR17BEGIN17WRITE(B+);目标代码26END;27r显ZFr27END.丁不显示11RUN PLO RUN J121131415END PLO *狂袒才科EWE目3S生 幵Mm.汪时目3J11112150Ett 0 iJM IS3011早12月29日八课程设计总结编译原理这门课,在计算机专业中也算是最难的一门课程吧,我也确实体会到了。老师 之前说的,只要看懂我们要修改的部分就可以了。其实不然。说实在的,想要改动任何一个 地方,都要把整个代码从头到尾彻底了解,得到各个函数部分的功能和作用,以及数据类型 的定义,才能很好地修改程序。学完编译原理这门课后,虽然我们没有亲手做一个编译器出来。但在这次拓充功能的课 程设计上,我们已经学到了很多。完成了这次课程设计,对我的动手能力有很大提高,特别 是对C+ Builder的操作以及对PL/O的理解和使用方面。平时看课本时,有时问题老是弄不 懂,做完课程设计,那些问题就迎刃而解了。而且还可以记住很多东西但是,也存在一些缺点,就是对理论知识的理解上尚不够透切,今后我要加强理论知的 学习。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!