广工编译原理实验报告文档最后含源码下载地址Word下载.docx
- 文档编号:973425
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:12
- 大小:274.32KB
广工编译原理实验报告文档最后含源码下载地址Word下载.docx
《广工编译原理实验报告文档最后含源码下载地址Word下载.docx》由会员分享,可在线阅读,更多相关《广工编译原理实验报告文档最后含源码下载地址Word下载.docx(12页珍藏版)》请在冰点文库上搜索。
(2)程序设计语言:
C++
(3)使用软件BorlandC++Builder6.0
(4)教学型编译程序:
PL/0
三:
题目分析与设计
第一部分:
增加单词
1)修改变量定义
constNORW=19;
/*#OFRESERVEDWORDS*/
intSBNUM=43;
typedefenum{NUL,IDENT,NUMBER,PLUS,MINUS,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,
TIMESBECOMES,SLASHBECOMES,ANDSYM,ORSYM,NOTSYM
}SYMBOL;
char*SYMOUT[]={"
NUL"
"
IDENT"
NUMBER"
PLUS"
MINUS"
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"
TIMESBECOMES"
SLASHBECOMES"
ANDSYM"
ORSYM"
NOTSYM"
};
strcpy(KWORD[1],"
BEGIN"
);
strcpy(KWORD[2],"
CALL"
strcpy(KWORD[3],"
CONST"
strcpy(KWORD[4],"
DO"
strcpy(KWORD[5],"
ELSE"
//增加字1
strcpy(KWORD[6],"
END"
strcpy(KWORD[7],"
FOR"
//增加字2
strcpy(KWORD[8],"
IF"
strcpy(KWORD[9],"
ODD"
strcpy(KWORD[10],"
PROCEDURE"
strcpy(KWORD[11],"
PROGRAM"
strcpy(KWORD[12],"
READ"
strcpy(KWORD[13],"
RETURN"
//增加字5
strcpy(KWORD[14],"
STEP"
//增加字3
strcpy(KWORD[15],"
THEN"
strcpy(KWORD[16],"
UNTIL"
//增加字4
strcpy(KWORD[17],"
VAR"
strcpy(KWORD[18],"
WHILE"
strcpy(KWORD[19],"
WRITE"
WSYM[1]=BEGINSYM;
WSYM[2]=CALLSYM;
WSYM[3]=CONSTSYM;
WSYM[4]=DOSYM;
WSYM[5]=ELSESYM;
WSYM[6]=ENDSYM;
WSYM[7]=FORSYM;
WSYM[8]=IFSYM;
WSYM[9]=ODDSYM;
WSYM[10]=PROCSYM;
WSYM[11]=PROGSYM;
WSYM[12]=READSYM;
WSYM[13]=RETURNSYM;
WSYM[14]=STEPSYM;
WSYM[15]=THENSYM;
WSYM[16]=UNTILSYM;
WSYM[17]=VARSYM;
WSYM[18]=WHILESYM;
WSYM[19]=WRITESYM;
在voidSTATEMENT(SYMSETFSYS,intLEV,int&
TX){}函数中增加:
caseELSESYM:
GetSym();
Form1->
printfs("
====ELSESYM===="
break;
caseSTEPSYM:
====STEPSYM===="
caseUNTILSYM:
====UNTILSYM===="
caseFORSYM:
====FORSYM===="
caseRETURNSYM:
====RETURNSYM===="
caseTIMESBECOMES:
~~~~*=~~~~"
caseSLASHBECOMES:
~~~~/=~~~~"
caseANDSYM:
~~~~&
~~~~"
caseORSYM:
~~~~||~~~~"
caseNOTSYM:
~~~~!
2)修改GetSym()方法
elseif(CH=='
*'
){
GetCh();
if(CH=='
='
){SYM=TIMESBECOMES;
}
elseSYM=TIMES;
}elseif(CH=='
/'
){SYM=SLASHBECOMES;
elseSYM=SLASH;
&
'
SYM=ANDSYM;
|'
){SYM=ORSYM;
elseError(19);
!
SYM=NOTSYM;
}else{SYM=SSYM[CH];
第二部分:
修改单词(将不等号#改为<
)
elseif(CH=='
<
){
if(CH=='
){SYM=LEQ;
elseif(CH=='
){SYM=NEQ;
elseSYM=LSS;
第三部分:
增加条件语句的ELSE子句,要求:
设计细节,包括:
相关文法、语法图、语义规则
1)语法图
2)修改STATEMENT()方法(只需要写出caseIFSYM:
部分的代码)
caseIFSYM:
GetSym();
CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);
if(SYM==THENSYM)GetSym();
elseError(16);
CX1=CX;
GEN(JPC,0,0);
STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX);
if(SYM==SEMICOLON)GetSym();
elseError(5);
//漏掉分号
if(SYM!
=ELSESYM)CODE[CX1].A=CX;
else{
CX2=CX;
GEN(JMP,0,0);
CODE[CX1].A=CX;
STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX);
CODE[CX2].A=CX;
break;
四:
测试部分
1.扩充单词的测试
PL0源码:
PROGRAMEX01;
VARA,B,C;
BEGIN
A:
=88;
READ(B);
ELSE;
FOR;
STEP;
UNTIL;
RETURN;
*=;
/=;
&
;
||;
!
C:
=A+B*(3+B);
WRITE(C);
END.
测试结果:
2.修改单词的测试(需给出测试的PL0源码)
IFB<
ATHEN
WRITE(B);
测试结果:
3.扩充else的测试(需给出测试的PL0源码)
ELSEWRITE(A);
五:
总结
总的来说,我体会到的觉得不仅仅是说对编译器进行了什么修改完成了什么功能了收获感,觉得更多的是在理解编译原理这门课程的基础上,对编译器执行代码编译的过程有了一个全新的认识。
其中增进了对PL0程序编译过程的理解,包括如何进行词法分析,语法分析,语义分析等过程。
但是对整个程序的详细运行过程及函数块功能还不是太理解,所以在完成的过程中,心中还是存在很多疑惑,尽管通过向同学请教解决了一些小问题,但还是缺乏深入的学习和研究。
接下来会花多点时间学习,尽量达到能够了解整个程序的原理及详细运行过程。
源码下载地址:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 文档 最后 源码 下载 地址