编译实验报告.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。
【心得体会】:
通过此次编译原理实验,对该课程的一些基本概念、词法分析、语法分析、属性文法和语法制导翻译有了深刻的了解并比较掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务