编译实验报告.docx

上传人:b****8 文档编号:30569617 上传时间:2023-08-16 格式:DOCX 页数:18 大小:52.68KB
下载 相关 举报
编译实验报告.docx_第1页
第1页 / 共18页
编译实验报告.docx_第2页
第2页 / 共18页
编译实验报告.docx_第3页
第3页 / 共18页
编译实验报告.docx_第4页
第4页 / 共18页
编译实验报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

编译实验报告.docx

《编译实验报告.docx》由会员分享,可在线阅读,更多相关《编译实验报告.docx(18页珍藏版)》请在冰豆网上搜索。

编译实验报告.docx

编译实验报告

编译原理

实验报告

 

学号:

姓名:

提交日期:

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。

【心得体会】:

通过此次编译原理实验,对该课程的一些基本概念、词法分析、语法分析、属性文法和语法制导翻译有了深刻的了解并比较掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1