编译实验报告.docx
- 文档编号:30569617
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:18
- 大小:52.68KB
编译实验报告.docx
《编译实验报告.docx》由会员分享,可在线阅读,更多相关《编译实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
编译实验报告
编译原理
实验报告
学号:
姓名:
提交日期:
2012-12-07
成绩:
东北大学秦皇岛分校
实验2:
词法分析程序的设计与实现
【实验目的】
设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解。
【实验内容】
通过对PL/0词法分析程序(GETSYM)的分析,并在此基础上对给出的PL/0语言的语法描述,编写一个PL/0语言的词法分析程序。
此程序应具有如下功能:
输入为字符串(待进行词法分析的源程序),输出为单词串,即由(单词、类别)所组成的二元组序列。
有一定检查错误的能力,例如发现2A这类不能作为单词的字符串。
【实验环境】
WindowsPC机,c++语言
【提交内容】
词法分析器的程序源代码如下:
【实验代码】
#include
#include
#include
#include
#include
#include
usingnamespacestd;
boolisLetter(charch){
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))returntrue;
elsereturnfalse;
}
boolisDigit(charch){
if(ch>='0'&&ch<='9')returntrue;
elsereturnfalse;
}
boolisP(charch){
if(ch=='+'||ch=='*'||ch=='-'||ch=='/')returntrue;
//ch==':
'||ch==','||ch=='='||ch==';'||ch=='('||ch==')'
elsereturnfalse;
}
boolisJ(charch){
if(ch==','||ch==';'||ch=='.'||ch=='('||ch==')'||ch=='['||ch==']'||ch=='='||ch==':
'||ch=='<'||ch=='>'||ch=='{'||ch=='}'||ch=='#')returntrue;
//
elsereturnfalse;
}
boolisBlank(charch){
if(ch==''||ch=='\t')returntrue;
elsereturnfalse;
}
intmain(){
stringsrc,ste,s;
charch0,ch,ch1[2];
charktt[48][20]={"and","begin","const","div","do","else","end","function","if","integer",
"not","or","procedure","program","read","real","then","type","var","while","write","标识符","无符号数",
",",";",":
",".","(",")","[","]","..","++","--","+","-","*","/","=","<",">","<>","<="
">=",":
=","{","}","#"};
intpos=0;
FILE*fp;
fp=fopen("pl0.txt","r");
ch0=fgetc(fp);
while(ch0!
=EOF)
{
//if(ch0!
='\t'){src+=ch0;}
src+=ch0;
ch0=fgetc(fp);
}
src+='#';
cout< ch=src[pos++]; ste=""; for(intj=0;j<47;j++){cout< if(j%002==1)cout< cout<<"词法分析: \n"; while(ch! ='#') { charstr[20]; if(ch! ='\n') { if(isDigit(ch)) {//判断常数 inti=0; while(isDigit(ch)||ch=='.') { str[i++]=ch; //i++; ch=src[pos++]; } str[i]='\0'; ste=ste+"|"+"22"; cout< continue; } elseif(isLetter(ch)) {//判断字符 inti=0,j; while(isLetter(ch)||isDigit(ch)) { str[i++]=ch; //i++; ch=src[pos++]; } str[i]='\0'; for(j=0;j<21;j++){//判断是否关键字 intt=strcmp(str,ktt[j]); if(t==0){ stringstreamss; ste+="|"; ss< ss>>ste; break; } } if(j==21){ste=ste+"|"+"21";} //cout<<""; cout< continue; } elseif(isP(ch)){///判断是否运算符 inti=0,j; str[i++]=ch; str[i]='\0'; for(j=34;j<38;j++){ intt=strcmp(str,ktt[j]); if(t==0){ stringstreamss; ste+="|"; ss< ss>>ste; break; } } cout< ch=src[pos++]; continue; } elseif(isJ(ch))//判断是否界符 { inti=0,j; while(isJ(ch)) { str[i++]=ch; ch=src[pos++]; } str[i]='\0'; for(j=23;j<47;j++){ intt=strcmp(str,ktt[j]); if(t==0){ stringstreamss; ste+="|"; ss< ss>>ste; break; } } cout< continue; } elseif(isBlank(ch)) { cout< ch=src[pos++]; continue; } } else{ cout< ste=""; } ch=src[pos++]; } return0; } 【测试的源文件】 Pl0.txt CONSTA=10; VARB,C; 2B PROCEDUREP; VARD; 2E PROCEDUREQ; VARX; BEGIN READ(X); D: =X; WHILEX<0 DOCALLP; END; BEGIN WRITE(D); CALLQ; END; BEGIN CALLP; END. [实验结果] 实验4: 递归子程序分析器的设计与实现 【实验目的和要求】 设计、编制、调试一个典型的语法分析程序,实现对如下文法的递归子程序语法分析,进一步掌握常用的语法分析方法。 【实验内容】 (1)本分析程序所分析的文法如下: G[E]: E→eBaA A→a|bAcB B→dEd|aC C→e|dC (2)针对上述文法编写一递归子程序分析程序,该程序的输入是任意符号串,输出是本次输入的符号串是否是该文法的句子的结论。 【实验环境】 WindowsPC机,任何版本的C语言。 【提交内容】 提交实验报告,报告内容如下: 目的要求、分析说明、算法描述、程序结构、各个子程序的程序框图及说明、主要变量名说明、程序清单、调试情况、设计技巧、心得体会。 提交源程序和可执行文件。 【源代码及相关注释】: /* 分析文法: G[E]: E→eBaA A→a|bAcB B→dEd|aC C→e|dC */ #include usingnamespacestd; boolA(); boolB(); boolC(); boolE(); chararray[20]; intpointer=0; boolE()//eBaA { if(array[pointer]! ='e') { returnfalse; } else { pointer++; if(! B()) { returnfalse; } } //pointer++; if(array[pointer]! ='a') { returnfalse; } else { pointer++; if(! A()) { returnfalse; } } returntrue; } boolA() { if(array[pointer]! ='a')//bAcB { if(array[pointer]! ='b') { returnfalse; } else { pointer++; if(! A()) { returnfalse; } else { //pointer++; if(array[pointer]! ='c') { returnfalse; } else { pointer++; if(! B()) {returnfalse; } else { //pointer++; returntrue; } } } } } else//a { pointer++; returntrue; } } boolB() { if(array[pointer]=='a')//aC { pointer++; if(C()) { returntrue; } else { returnfalse; } } elseif(array[pointer]=='d')//dEd { pointer++; if(E()) { //pointer++; if(array[pointer]=='d') { pointer++; returntrue; } else { returnfalse; } } else { returnfalse; } } else { returnfalse; } } boolC() { if(array[pointer]=='e')//e { pointer++; returntrue; } elseif(array[pointer]=='d')//dC { pointer++; if(C()) { returntrue; } else { returnfalse; } } else { returnfalse; } } intmain() { cout<<"pleaseinputthechararrayyouwanttotestendwith#"< cin>>array; if(E()&&array[pointer]=='#') cout<<"OK"< else cout<<"error"< return0; } 【运行结果】 输入一个正确的字符串,得到正确的判断OK 输入一个错误的字符串,得到判断错误的结论error。 【心得体会】: 通过此次编译原理实验,对该课程的一些基本概念、词法分析、语法分析、属性文法和语法制导翻译有了深刻的了解并比较掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)