编译原理上机实验报告解析.docx

上传人:b****7 文档编号:23486929 上传时间:2023-05-17 格式:DOCX 页数:18 大小:86.45KB
下载 相关 举报
编译原理上机实验报告解析.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级6班

学号3112006028

学生姓名曾主赐

辅导教师刘添添

成绩

 

2014年12月

 

一.完成内容

1.扩充单词:

(1)保留字:

for,step,until,char,real,return;

(2)双字符:

*=,/=;

(3)单字符:

[,],*,/;

2.扩充语句:

vara;

begin

a:

=1;

do

a:

=a+1

whilea<5;

write(a);

end.

二.设计思路

1.扩充单词

1)修改变量定义:

voidinit()

{

inti;

for(i=0;i<=255;i++)

{

ssym[i]=nul;

}

ssym['+']=plus;

ssym['-']=minus;

ssym['*']=times;

ssym['/']=slash;

ssym['(']=lparen;

ssym[')']=rparen;

ssym['=']=eql;

ssym[',']=comma;

ssym['.']=period;

ssym['#']=neq;

ssym[';']=semicolon;

ssym['[']=l1;

ssym[']']=r1;

/*设置保留字名字,按照字母顺序,便于折半查找*/

strcpy(&(word[0][0]),"begin");

strcpy(&(word[1][0]),"call");

strcpy(&(word[2][0]),"char");

strcpy(&(word[3][0]),"const");

strcpy(&(word[4][0]),"do");

strcpy(&(word[5][0]),"end");

strcpy(&(word[6][0]),"for");

strcpy(&(word[7][0]),"if");

strcpy(&(word[8][0]),"odd");

strcpy(&(word[9][0]),"procedure");

strcpy(&(word[10][0]),"read");

strcpy(&(word[11][0]),"real");

strcpy(&(word[12][0]),"return");

strcpy(&(word[13][0]),"step");

strcpy(&(word[14][0]),"then");

strcpy(&(word[15][0]),"until");

strcpy(&(word[16][0]),"var");

strcpy(&(word[17][0]),"while");

strcpy(&(word[18][0]),"write");

/*设置保留字符号*/

wsym[0]=beginsym;

wsym[1]=callsym;

wsym[2]=charsym;

wsym[3]=constsym;

wsym[4]=dosym;

wsym[5]=endsym;

wsym[6]=forsym;

wsym[7]=ifsym;

wsym[8]=oddsym;

wsym[9]=procsym;

wsym[10]=readsym;

wsym[11]=realsym;

wsym[12]=returnsym;

wsym[13]=stepsym;

wsym[14]=thensym;

wsym[15]=untilsym;

wsym[16]=varsym;

wsym[17]=whilesym;

wsym[18]=writesym;

修改pl0.h头文件里定义的全局数据:

#definenorw19/*关键字个数*/

#definetxmax100/*名字表容量*/

#definenmax14/*number的最大位数*/

#defineal10/*符号的最大长度*/

#defineamax2047/*地址上界*/

#definelevmax3/*最大允许过程嵌套声明层数[0,lexmax]*/

#definecxmax200/*最多的虚拟机代码数*/

/*符号*/

enumsymbol{

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,forsym,stepsym,untilsym,

charsym,realsym,returnsym,p,q,l1,r1

};

#definesymnum42

/*-------------*/

2)修改GetSym()方法:

/*词法分析,获取一个符号*/

intgetsym()

{

inti,j,k;

while(ch==''||ch==10||ch==9)

{

getchdo;

}

if(ch>='a'&&ch<='z')

{

k=0;

do{

if(k

{

a[k]=ch;

k++;

}

getchdo;

}while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');

a[k]=0;

strcpy(id,a);

i=0;

j=norw-1;

do{

k=(i+j)/2;

if(strcmp(id,word[k])<=0)

{

j=k-1;

}

if(strcmp(id,word[k])>=0)

{

i=k+1;

}

}while(i<=j);

if(i-1>j)

{

sym=wsym[k];

printf("保留字\n");

}

else

{

sym=ident;

printf("标识符\n");

}

}

else

{

if(ch>='0'&&ch<='9')

{

k=0;

num=0;

sym=number;

do{

num=10*num+ch-'0';

k++;

getchdo;

}while(ch>='0'&&ch<='9');/*获取数字的值*/

k--;

if(k>nmax)

{

error(30);

}

}

else

{

if(ch==':

')/*检测赋值符号*/

{

getchdo;

if(ch=='=')

{

sym=becomes;

printf(":

=\n");

getchdo;

}

else

{

sym=nul;/*不能识别的符号*/

printf("\n");

}

}

else

if(ch=='*')/*xiugai*/

{

getchdo;

if(ch=='=')

{

sym=p;

printf("*=\n");

getchdo;

}

else

{

sym=times;

printf("*\n");

getchdo;

}

}

else

if(ch=='/')

{

getchdo;

if(ch=='=')

{

sym=q;

printf("/=\n");

getchdo;

}

else

{

sym=slash;

printf("/\n");

getchdo;

}

}

else

{

if(ch=='<')/*检测小于或小于等于符号*/

{

getchdo;

if(ch=='=')

{

sym=leq;

printf("<=\n");

getchdo;

}

else

{

sym=lss;

printf("<\n");

}

}

else

{

if(ch=='>')/*检测大于或大于等于符号*/

{

getchdo;

if(ch=='=')

{

sym=geq;

printf(">=\n");

getchdo;

}

else

{

sym=gtr;

printf(">\n");

}

}

else

{

sym=ssym[ch];/*当符号不满足上述条件时,全部按照单字符号处理*/

printf("单字符\n");

//getchdo;

//richard

if(sym!

=period)

{

getchdo;

}

//endrichard

}

}

}

}

}

return0;

}

2.扩充语句

1)产生式以及语法描述图:

产生式:

a:

=1doa:

=a+1whilea<5

语法描述图:

2)递归下降子程序:

if(sym==dosym)

{

getsymdo;

memcpy(nxtlev,fsys,sizeof(bool)*symnum);

nxtlev[whilesym]=true;

statementdo(fsys,ptx,lev);

if(sym==whilesym)

{

getsymdo;

conditiondo(nxtlev,ptx,lev);

}

else

{

error(18);

}

3)举例设计语句的pcode代码:

vara;

begin

a:

=1;

do

a:

=a+1

whilea<5;

write(a);

end.

1int04

2int01

3sto03

4lod03

5lit01

6opr02

7sto03

8lod03

9lit05

10opr010

11jpc013

12jmp04

13lod03

14opr014

15opr015

16opr00

4)在递归下降子程序中增加语义动作:

if(sym==dosym)

{

cx1=cx;

getsymdo;

memcpy(nxtlev,fsys,sizeof(bool)*symnum);

nxtlev[whilesym]=true;

statementdo(fsys,ptx,lev);

if(sym==whilesym)

{

getsymdo;

conditiondo(nxtlev,ptx,lev);

cx2=cx;

gendo(jpc,0,0);

gendo(jmp,0,cx1);

code[cx2].a=cx;

}

else

{

error(18);

}

 

三.运行测试

1.扩充单词的测试(贴运行结果截图)

ps:

测试情况要全!

图片大小合适!

截图如下所示:

2.语句的测试(贴运行结果截图)

截图如下所示:

四.心得

归纳完成过程的心得:

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

当前位置:首页 > 经管营销 > 经济市场

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

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