编译原理实验参考_第1页
编译原理实验参考_第2页
编译原理实验参考_第3页
编译原理实验参考_第4页
编译原理实验参考_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、 完成内容1、增加单词:保留字 ELSE,FOR,STEP,UNTIL,RETURN 运算符 *=,/=,&,|,!2、修改单词:不等号# 改为 < >3、增加条件语句的ELSE子句2、 设计思路1、扩充单词 (1) 修改变量定义 1) 关键字个数增加5个const NORW = 14+5; 2) 符号表修改typedef enum NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, P

2、ERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM, ELSESYM , FORSYM,STEPSYM,UNTILSYM,RETURNSYM,TIMESBECOMES,SLASHBECOMES, PLUSPLUS,MINUSMINUS, AND, OR, NOT SYMBOL;char *SYMOUT = "NUL", "IDENT", "

3、NUMBER", "PLUS", "MINUS", "TIMES","SLASH", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", "GTR", "GEQ","LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PER

4、IOD","BECOMES", "BEGINSYM", "ENDSYM", "IFSYM", "THENSYM", "WHILESYM", "WRITESYM", "READSYM", "DOSYM", "CALLSYM","CONSTSYM", "VARSYM", "PROCSYM", "PROGSYM",

5、 "ELSESYM","FORSYM","TOSYM","DOWNTOSYM","RETURNSYM" ,"TIMESBECOMES","SLASHBECOMES", "PLUSPLUS", "MINUSMINUS", "AND", "OR", "NOT"3) 修改关键字表strcpy(KWORD 1,"BEGIN"); strcpy(K

6、WORD 2,"CALL"); strcpy(KWORD 3,"CONST"); strcpy(KWORD 4,"DO"); strcpy(KWORD 5,"ELSE");strcpy(KWORD 6,"END");strcpy(KWORD 7,"FOR");strcpy(KWORD 8,"IF"); strcpy(KWORD9,"ODD"); strcpy(KWORD10,"PROCEDURE"); strcpy(

7、KWORD11,"PROGRAM"); strcpy(KWORD12,"READ"); strcpy(KWORD13,"RETURN"); strcpy(KWORD14,"STEP"); strcpy(KWORD15,"THEN"); strcpy(KWORD16,"UNTIL"); strcpy(KWORD17,"VAR");strcpy(KWORD18,"WHILE");strcpy(KWORD19,"WRITE"

8、;); 4) 修改关键字的机内表示WSYM 1=BEGINSYM; WSYM 2=CALLSYM; WSYM 3=CONSTSYM; WSYM 4=DOSYM; WSYM 5=ELSESYM;WSYM 6=ENDSYM;WSYM 7=FORSYM;WSYM 8=IFSYM; WSYM9=ODDSYM; WSYM10=PROCSYM; WSYM11=PROGSYM; WSYM12=READSYM; WSYM13=RETURNSYM; WSYM14=STEPSYM; WSYM15=THENSYM; WSYM16=UNTILSYM; WSYM17=VARSYM;WSYM18=WHILESYM;WSY

9、M19=WRITESYM;5) 修改单字符表 SSYM'+'=PLUS; SSYM'-'=MINUS; SSYM'*'=TIMES; SSYM'/'=SLASH; SSYM'('=LPAREN; SSYM')'=RPAREN; SSYM'='=EQL; SSYM','=COMMA; SSYM'.'=PERIOD;SSYM''=SEMICOLON;SSYM'&'=AND;SSYM'|'=OR;SSY

10、M'!'=NOT;/删除SSYM'#'=NEQ; (2) 修改GetSym方法.else if (CH='<') GetCh(); if (CH='=') SYM=LEQ; GetCh(); else if(CH='>')SYM=NEQ;GetCh(); / 识别不等号< > else SYM=LSS; else if(CH='*') GetCh(); if(CH='=')SYM=TIMESBECOMES;Form1->printfs("- *

11、= -");GetCh();/ 识别 *= else SYM=TIMES; else if(CH='/') GetCh(); if(CH='=')SYM=SLASHBECOMES;Form1->printfs("- /= -");GetCh();/识别 /= else SYM=SLASH; else if(CH='+') GetCh(); if(CH='+') SYM=PLUSPLUS;Form1->printfs("- + -"); GetCh();/识别 + els

12、e SYM=PLUS; else if(CH='-') GetCh(); if(CH='-') SYM=MINUSMINUS;Form1->printfs("- - - -"); GetCh();/识别 - - else SYM=MINUS; else if(CH='&')/识别 & GetCh(); SYM=AND; Form1->printfs("- & -");GetCh(); else if(CH='|')/识别 | GetCh(); SYM=OR

13、; Form1->printfs("- | -");GetCh(); else if(CH='!')/识别 ! GetCh(); SYM=NOT; Form1->printfs("- ! -");GetCh(); (3) 修改statement方法switch(SYM)case FORSYM: Form1->printfs("-FOR-"); GetSym(); break; case STEPSYM: Form1->printfs("-STEP-"); GetSym();

14、break; case UNTILSYM: Form1->printfs("-UNTIL-"); GetSym(); break; case RETURNSYM: Form1->printfs("-RETURN-"); GetSym(); break;2、 增加else子句 (1) 语法描述图 (2) 递归下降子程序 statement()if(SYM=IFSYM)GetSym(); condition();if(SYM=THENSYM) GetSym();else Error();statement();if(SYM=ELSESYM)Get

15、Sym();statement(); (3) 举例设计的pcode代码if(a>b)then write(a);else write(b);其pcode代码如下:1) LOD 0 3 /a2) LOD 0 4 /b3) OPR 0 124) JPC 0 9)5) LOD 0 36) OPR 0 147) OPR 0 158) JMP 0 12)9) LOD 0 410) OPR 0 1411) OPR 0 1512) (4) 在递归下降子程序上加入语句动作 case IFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM)

16、,FSYS),LEV,TX);if (SYM=THENSYM) GetSym();else Error(16);CX1=CX; GEN(JPC,0,0);STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX);if(SYM=ELSESYM) GetSym(); CODECX1.A=CX; CX2=CX; GEN(JMP,0,0); STATEMENT(FSYS,LEV,TX); CODECX2.A=CX;else CODECX1.A=CX;break;3、 运行测试1、 扩充单词测试关键字用例:(TEST.PL0)PROGRAM EX01;VAR A;BEGIN FOR; UNTIL; STEP; RETURN; WRITE(A);END.运行结果截图: 测试运算符用例:(E02.PL0) PROGRAM EX02; BEGIN *=; /=; & |; !; END. 运算结果截图:2、增加ELSE子句测试ELSE子句、不等号<>用例:(E01.PL0)PROGRAM EX0

温馨提示

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

评论

0/150

提交评论