将词法、语法、代码生成等实验组合成一个大的编译程序_第1页
将词法、语法、代码生成等实验组合成一个大的编译程序_第2页
将词法、语法、代码生成等实验组合成一个大的编译程序_第3页
将词法、语法、代码生成等实验组合成一个大的编译程序_第4页
将词法、语法、代码生成等实验组合成一个大的编译程序_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

郑州经工业学院

课程设计说明书

题目:将词法、语法、代码生成等实验组合成一个大实验

姓名:_______________

院(系):计算机与通信工程学院

专业班级:计算机科学与技术10-01

学号:_____________

指导教师:马吉明_______________

成绩:___________________

时间:2013年6月17日至2013年6月日

郑州轻工业学院

课程设计任务书

题目将词法、语法、代码生成等实验组合成一个大实验__________

专业、班级计算机科学与技术10-01学号

姓名_______________

主要内容

自选一种常见高级语言为背景,对其进行简化.例如只包括整型常数和

其四则运算以及相应的赋值语句,转移语句,条件语句和最简单的输入输出

语句等.编制一个包括必要处理阶段(词法分析、语法分析、语义分析、代

码生成)简化又完整的编译程序。

基本要求

(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码四元式的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

主要参考资料

《程序设计语言编译原理》陈火旺编著国防工业出版社

《编译原理》吕映芝张素琴蒋维杜编著清华大学出版社

完成期限:2013年6月21日

指导教师签名:___________________

课程负责人签名:___________________

年月日

目录

1绪论....................................................2

1.1设计目的...........................................2

1.2设计要求..........................................2

1.2.1算法过程......................................2

1.2.2主流程图......................................2

1.3设计内容...........................................3

1.3.1题目..........................................3

1.3.2内容..........................................3

2总体设计................................................3

2.1算法描述...........................................4

2.2函数说明和数据结构.................................4

3详细设计与实现..........................................5

3.1词法分析...........................................5

3.2语法分析..........................................7

3.3代码生成器........................................9

3.4结果...............................................9

4参考文献...............................................11

5心得体会...............................................11

6附录代码...............................................11

1绪论

1.1设计目的

《编译原理》是理论与实践并重的课程,而其实验课要综合运用所学的多门

课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分

析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统

的独立分析和设计的能力,进一步培养学生的独立编程能力。

1.2设计要求

1.2.1算法过程

词法分析程序少语法分析程序今语义分析程序9编译器。不断完

善,不断改进。渐变的过程。

1.2.2主流程图

1.3设计内容

1.3.1题目

将词法、语法、代码生成等实验组合成一个大实验

1.3.2内容

涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实

现以及生成中间代码。

2总体设计

2.1算法描述

语法分析阶段的基本任务是将词法分析阶段产生的二元组作为输入,根

据语言的语法规则,识别出各种语法成分,并判断该单词符号序列是否是该

语言的一个句子。

在语法分析阶段,采用自上而下的递归下降分析法,根据递归下降分析

函数编写规则来编写相应的函数,在各个函数的分析过程中调用词法分析程

序中的扫描程序,发出“取下一个单词符号”的命令,以取得下一个单词符

号的语法分析。

词法分析和语法分析的整体设计思想可由以下图示表示:

单词符号

字符

字符串表示的源程序分

取一下个

单词符号

语法分析是在词法分析的基础上加上判断是否符合语法规则的语句。语法

分析的基本任务是使用词法分析的结果,使用递归下降算法分析是否符合语法

规则,如果符合,则输出“分析成功”,若果不符合,则输出“分析失败”。

2.2函数说明和数据结构

在main函数调用e()函数,如果调用之后返回时,如果

((flags[temp]==O)&&is_right)为真,就输出"分析成功”,否则输出“分析

失败”。其中isjight为设定的标志,初值为1,如果在调用子函数的过程中

如果有错误,则置is_right为Oo

e函数:调用t函数,调用f函数,调用p函数,返回后看是否是'+'或'

」,如果是,则调用el函数,再调用e2函数,如果不是,进行出错处理,

置is_right为Oo

el函数:判断是不是“+”或者“-”如果是,调用f函数,如果不是,

进行出错处理,置isright为0。

t函数:调用f函数,调用P函数,返回后看是否是‘*'或'如果是,

则调用tl函数,再调用t2函数,如果不是,进行出错处理,置is_right

为Oo

tl函数:判断是不是"*"或者“/”如果是,调用f函数,如果不是,

进行出错处理,置is_right为Oo

f函数:调用p函数,fl函数。

门函数:判断是不是“,如果是,调用f函数,如果不是,进行出错处

理,置is_right为Oo

P函数:检查是否标识符,如果是,调用fl函数,如果不是,检查是否

是数值,如果是,调用fl函数,如果不是,检查是否是‘(’,如果不是,进

行出错处理,置is_right为Oo如果是,调用e函数,返回后检查是否是‘)',

如果不是,进行出错处理,置is_right为0。如果是,调用门函数,返回。

3详细设计与实现

3.1词法分析

首先定义结构体

typedefstruct〃状态栈

(

intdata[max];

inttop;

}seqstackl;

typedefstruct〃符号栈

(

stringdata[max];

inttop;

}seqstack2;

structreserveedword〃保留字表结构

stringword;

charvalue;

}reserveedwordl[maxsize];

structidentifer〃标识符表结构

charidentiname[15];

charidentitype[15];

intaddress;

}identiferl[maxsize];

structconstant〃常量表结构

stringconstantname;

stringvalue;

intconstantaddress;

}constantl[maxsize];

词法分析主要函数结构:

voidInitscannerO〃该函数用于用C语言当中常见的关键字初始

化保留表

voidIsalpha(chars)〃用于判断读入的字符是不是字母

voidIsnumber(chars)〃用于判断读入的字符是不是数字

voidIsother(chars)〃判断除数字与字母之外的其他字符

voidLexscanO〃用于循环从程序中读入字符并判断应调用那

个判断函数字符

voidOutput(inti,intj,charss[15])//输出二元式

本模块程序的伪代码如下:

打开文件

in("input.txtz,,ios::in);

if(!infile)

cerr<<“读取的文件打开失败!”《endl;

exit(1);

初始化保留字表

Initscanner();

循环读入从文件当中

Scanner()

(

while(ch!='#')

(

在该函数中判断应该调用的判断函数

Lexscan()

(

in(ch);

if(((ch>=,A")&&(ch<=,Z"))||((ch>=,a)&&(ch<=,z')))

Isalpha(ch){Output};

elseif((ch>='O')&&(ch<=’9'))

Isnumber(ch){Output);

else

Isother(ch){Output};

)

)

)

关闭文件

in();

词法分析器中从源文件读出一个单词,判断其类型是关键字、标识符还

是普通符号,根据其类型为结构体各项赋值,并将其传给语法分析函数。

3.2语法分析

由于说明语句与算术表达式和赋值语句所使用的是不同的文法,所以两

者的ACTION表和GOTO表也不一样,本次课设采用二维数组存放ACTION表和

GOTO表信息,其中移进用大于0的数表示,归约用小于0的数表示,成功用

100表示(acc),其他处用0表示,查表时遇到相应的数进行相应的操作。

根据状态转换图(DFA)构造SLR(l)分析表:

其中说明文法和算术文法分别构造,同时在每个表当中既有action表又

有goto表

intanalysis_tablel[10][8]={3,4,0,0,0,0,2,1,

0,0,0,0,0,100,0,0,

0,0,5,6,0,0,0,0,

0,0,0,0,7,0,0,0,

0,0,0,0,8,0,0,0,

0,0,0,0,0,—1,0,0,

0,0,0,0,9,0,0,0,

0,0,~2,~2,0,0,0,0,

0,0,~3,~3,0,0,0,0,

0,0,-4,-4,0,0,0,0};

intanalysis_table2[17][13]={0,2,0,0,0,0,0,0,0,0,1,0,0,

100,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,3,0,0,0,0,0,0,0,0,0,0,

0,9,0,8,0,0,0,7,0,6,0,4,5,

0,0,0,0,10,11,0,0,0,0,0,0,0,

0,0,0,0,-3,-3,12,0,-3,0,0,0,0,

0,0,0,0,-5,~5,-5,0,-5,0,0,0,0,

0,9,0,8,0,0,0,7,0,6,0,13,5,

0,0,0,0,_8,-8,-8,0,-8,0,0,0,0,

0,0,0,0,~7,~7,~7,0,-7,0,0,0,0,

-1,0,0,0,0,0,0,0,0,0,0,0,0,

0,9,0,8,0,0,0,7,0,6,0,0,14,

0,9,0,8,0,0,0,7,0,15,0,0,0,

0,0,0,0,0,11,0,0,16,0,0,0,0,

0,0,0,0,_2,-2,12,0,-2,0,0,0,0,

0,0,0,0,-4,_4,-4,0,-4,0,0,0,0,

0,0,0,0,-6,-6,-6,0,-6,0,0,0,0};

3.3代码生成器

令算法描述:

下面以简单算术表达式语句的翻译为例详细说明算法设计。

实现简单算术表达式的翻译一般采取下列步骤:

>分析文法。

>设置一系列语义变量,定义语义过程,语义函数。

>设计算术表达式的递归下降子程序的程序分析算法。

令函数说明和数据结构:

Strn用来存放临时变量的序号。

temp用来存放数组的下表,在主程序中语法分析结束后,置0.

定义函数newtempO用于门生一个新的临时变量的名字,具体实现时每

产生一个T,就及时送到符号表中,也可以不进符号表,直接将单词值用

整数码表示。

定义函数siyuan(),输出一个四元式。

定义函数ye()进行中间代码生成

3.4结果

一™*™™™™语法语义分析情况一™™™™™™

状态栈符号栈语义栈动作说明

0一action[0»int1=S3桃态3人栈

03ttintaction[3,id]=S7状态7人栈

037ttintid—用id归匏goto[0,DJ=2

02MDaction[2,.]=S6状态6人栈

026肛action[6,id]=S9状态9人栈

0269叽id用D->D,id归约gotoC0,DJ=2

02#Daction[2,;J=S5状态5人栈

025ttD;—用S->D;归约goto[0,S]=1

01ttS分析成功!

3tt—action[0,id]=S?注态々入我

32ttid_action[2,=]=S3状态力

323#id=_action[3,num]=S8状态8人栈

3238ttid=nun用F->num归约goto13.F]=6

3236ttid=F一3用T->F归为goto[3,T]=5

3235ttid=T_3用E->T归约goto13,E]=4

3234ttid=E_3action14,;]=S10状态i0入栈

323410ttid=E;_3_用*>id=E;归约goto[0,AJ=1

31MA分析成功!

0州_action10.id]=S2注态2人栈

02ttid__action[2,=]=S3状态3入栈

023ttid=action13.id]=S9状态9人栈

0239#id=id用F->id归约goto[3,F]=6

6236ttid=F___i*由T->F归约goto13.TJ=5

0235ttid=T___ractionl:5.*]=S12状态12入骨

023512ttid=T*___r_action[12,id]=S9状态9人栈

0235129#id=T*id_r用F->id归")gotoH2,FJ=15

02351215#id=T*F_i*_r用T->T疝归约goto[3,T]=5

0235ttid=T_T1用E->T归约got«H3.E]=4

0234ttid=E_T1action[4,♦]=S11状态11入骨

023411ttid=E+T1action[11,id]=S9状态9人栈

0234119#id=E+id_Tl_用F->id归约goto[11,F]=6

0234116ttid=E+F_Tl_r用T->P归约gotoCU,T]=:L4

02341114ttid=E+T_Tl_y用E->E+T归约goto[3,E]=4

0234ttid=E_T2action[4,;]=S10状态10人栈

023410#id=E;T2用A->id=E;归约goto[0,A]=l

01_ai*ea一一一分更四也一—一一――

生成的二元式为:

<int

<id,0>

〈一一〉

<numJ.0>

<id,0>

<id,l>

生成的标识符表为:

nametypeualueaddress

0areaint

1rint

生成的常数表为:

valuetypenameaddress

03

产生的四元式为

<=,3,_,r>

<+,Tl,r,T2>

<=,T2,_,ai*ea>

4参考文献

《程序设计语言编译原理》陈火旺编著国防工业出版社

《编译原理》吕映芝张素琴蒋维杜编著清华大学出版社

《编译原理》AlfredV.Aheo等李建中译机械工业出版社

5心得体会

刚拿到课设题目的时候,感觉很难,没有头绪。虽然之前实验时候,词法

分析程序和语法分析程序的代码都是自己一个一个敲的。但是后来发现,更难

的东西在后边。接下来熟悉了一下原先写的代码,然后开始继续后边的部分。

个人认为这次课设的机会非常宝贵,加深了我对编译器处理语言的过程的理解。

我想,作为学计算机的学生,不应该只会用Java,或者C++,或者C#。一门高

级语言其实学起来是很不容易的,而在校期间,这些计算机基础课程一定要学

好!才能为将来打好基础。

6附录代码

#include<iostream>

#include<fstream>

usingnamespacestd;

#definemaxsize50

#definemax30

ifstreaminfile;

charch;

intm,n,kk=O,addr=O,t=l;

stringgetl;

stringin[maxsize];

stringins[maxsize];

strings[4];

intcount=0;

stringvl\_o]={int,float,;,,,id,ft,D,SJ;

string

v2[13]={"#","id","nunT,"F","A","E","T"}

I

.「〃〃〃〃T〃〃T1〃〃L〃〃

stri•ngE=,El=,T=,Tl=,F=;

intanalysis_tablel[10][8]={3,4,0,0,0,0,2,1,

0,0,0,0,0,100,0,0,

0,0,5,6,0,0,0,0,

0,0,0,0,7,0,0,0,

0,0,0,0,8,0,0,0,

0,0,0,0,0,~1,0,0,

0,0,0,0,9,0,0,0,

0,0,_2,—2,0,0,0,0,

0,0,-3,-3,0,0,0,0,

0,0,-4,-4,0,0,0,0};

intanalysis_table2[17][13]={0,2,0,0,0,0,0,0,0,0,1,0,0,

100,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,3,0,0,0,0,0,0,0,0,0,0,

0,9,0,8,0,0,0,7,0,6,0,4,5,

0,0,0,0,10,11,0,0,0,0,0,0,0,

0,0,0,0,~3,~3,12,0,-3,0,0,0,0,

0,0,0,0,-5,-5,-5,0,-5,0,0,0,0,

0,9,0,8,0,0,0,7,0,6,0,13,5,

0,0,0,0,~8,-8,-8,0,-8,0,0,0,0,

0,0,0,0,-7,-7,-7,0,-7,0,0,0,0,

-1,I0,0,0,0,0,0,0,0,0,0,0,0,

0,9,0,8,0,0,0,7,0,6,0,0,14,

0,9,0,8,0,0,0,7,0,15,0,0,0,

0,0,0,0,0,11,0,0,16,0,0,0,0,

0,0,0,0,_2,-2,12,0,-2,0,0,0,0,

0,0,0,0,-4,-4,-4,0,-4,0,0,0,0,

0,0,0,0,-6,-6,-6,0,-6,0,0,0,0);

typedefstruct〃状态栈

(

intdata[max];

inttop;

}seqstackl;

typedefstruct〃符号栈

(

stringdata[max];

inttop;

}seqstack2;

structreserveedword〃保留字表结构

stringword;

charvalue;

}reserveedwordl[maxsize];

structidentifer〃标识符表结构

(

charidentiname[15];

charidentitype[15];

intaddress;

}identiferl[maxsize];

structconstant//常量表结构

(

stringconstantname;

stringvalue;

intconstantaddress;

}constantl[maxsize];

voidInitscanner();

voidLexscanO;

voidIsalpha(char);

voidIsnumber(char);

voidIsother(char);

voidOutput(int,int,char*);

voidScanner();

voidchange(charc[],stringstr)

intlen=str.length();

for(intnum=0;num<1en;num++)

c[num]=str[num];

c[len]=,\0J;

)

seqstackl*init_seqstackl()

(

seqstackl*s;

s=newseqstackl;

if(!s)

(

coutX〈〃空间不足!,z«endl;

returnNULL;

)

else

(

s->top=-l;

returns;

)

)

intempty_seql(seqstackl*s)

(

if(s->top==-l)

return1;

else

return0;

intpush_seql(seqstackl*s,intx)

if(s->top==max-l)

return0;

else

(

s->top++;

s->data[s->top]=x;

return1;

)

}

intpop_seql(seqstackl*s,int*x)

(

if(empty_seql(s))

return0;

else

(

*x=s->data[s->top];

s->top一;

return1;

voidtop_seql(seqstackl*s,int&e)

if(empty_seql(s))

cout<<〃占空!〃;

else

e=s->dataLs->top];

)

seqstack2*init_seqstack2()

(

seqstack2*s;

s=newseqstack2;

if(!s)

(

cout<<〃空间不足!z,«endl;

returnNULL;

)

else

(

s->top="l;

returns;

)

}

intempty_seq2(seqstack2*s)

(

if(s->top==-l)

return1;

else

return0;

intpush_seq2(seqstack2*s,stringx)

(

if(s->top==max-l)

return0;

else

(

s->top++;

s->data[s->top]=x;

return1;

)

)

intpop_seq2(seqstack2*s,string*x)

(

if(empty_seq2(s))

return0;

else

(

*x=s->data[s->top];

s->top-;

return1;

}

voidout_seql(seqstackl*s)

for(inti=0;i<=s->top;i++)

printfs->data[i]);

voidout_seq2(seqstack2*s)

(

charch[15];

for(inti=0;i<=s->top;i++)

(

change(ch,s->data[i]);

printf(〃%s〃,ch);

)

)

seqstackl*sl=init_seqstackl();

seqstack2*s2=init_seqstack2();

seqstack2*s3=init_seqstack2();

voidpop(intn)

(

intm;

strings;

for(inti=0;i<n;i++)

pop_seql(si,&m);

pop_seq2(s2,&s);

pop_seq2(s3,&s);

intscreamp(chara[15],stringb)

inti=0,j=0;

while(a[i]!='\0'!='\0')

{

if(a[i]==b[i])

(

i++;

j++;

}

else

return0;

)

if(a[i]==b[i])

return1;

else

return0;

}

intscreampl(stringa,stringb)

(

inti=0,j=0;

while(a[i]!='\0'!='\0')

if(a[i]==b[i])

i++;

j++;

)

else

return0;

)

if(a[i]==b[i])

return1;

else

return0;

)

voidclear(seqstackl*sl,seqstack2*s2,seqstack2*s3)

(

intm;

strings;

while(!empty_seql(si))

(

pop_seql(si,&m);

pop_seq2(s2,&s);

pop_seq2(s3,&s);

)

)

voidcharTable()

charstrl[15],str2[15];

cout«〃\n生成的标识符表为:〃;

cout<<,,\n\tname\ttype\tvalue\taddress,z;

for(inti=0;i<m;i++)

printf(z,\n%d\t%s\t%s,z,i,identiferl[i].identiname,identiferl[i].

identitype);

cout«〃"生成的常数表为:〃;

cout<<,z\n\tvalue\ttype\tname\taddressz,;

for(intj=0;j<n;j++)

(

change(strl,constantl[j].constantname);

change(str2,constantl[j].value);

printfC,\n%d\t%s\t%s,z,j,strl,str2);

)

)

intjudge(stringm[],inti,stringx)

(

for(intj=0;j<i;j++)

if(screampl(x,

return1;

return0;

intaddress(stringm[],inti,stringx)

for(intj=0;j<i;j++)

if(screampl(x,m[j]))

returnj;

)

voidprint(strings[])

(

cout«zz\n产生的四元式为〃<<endl;

charch[max];

for(inti=0;i<count;i++)

(

change(ch,s[i]);

printf(〃%s〃,ch);

cout<<endl;

)

cout<<endl;

)

voidemit(stringstrl,stringstr2,stringstr3,stringstr4)

(

s[count]+=zz(〃;s[count]+=strl;s[count]+=,/,;

s[count]+=str2;s[count]+二〃,〃;s[count]+=str3;

s[count]+=〃,〃;s[count]+=str4;s[count]+=〃)〃;

count++;

stringnewtempO

chars[2];

s[0]=V;

s[l]=t;

S⑵八O';

t++;

returns;

}

voidactionl(inti,strings)

(

intpos,j;

j=address(vl,8,s);

pos=analysis_tablel[i][j];

charstr[15];

change(str,s);

out_seql(si);

printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq2(s3);printf

(〃\t\t〃);

if(pos==100)

(

cout<<〃分析成功!z,«endl;

***************〃〈<eridl;

)

else

printf(,zaction[%d,%s]=S%d状态%d入栈\n〃,i,str,pos,pos);

pushseql(si,pos);

push_seq2(s2,s);

push_seq2(s3,〃_〃);

getl=in[addr];

addr++;

)

voidgotol(inti,strings)

(

intpos,j;

if(judge(vl,8,s))

j=address(vl,8,s);

pos=analysis_tablel[i][j];

charstr[15];

change(str,s);

printf(z,goto[%d,%s]=%d\nz,,i,str,pos);

push_seql(si,pos);

push_seq2(s2,s);

}

voidslrl()

(

clear(si,s2,s3);

charstrl[15];

pushseql(si,0);

push_seq2(s2,〃#〃);

push_seq2(s3,〃_〃);

getl=in[addr];

addr++;

inttop,j;

while(1)

(

j=address(vl,8,getl);

top_seql(si,top);

if(top==100)

(

addr一;

return;

)

j=analysis_tablel[top][j];

if(j<0)

(

if(j==-l)

{

out_seql(si);printf("\t\t");out_seq2(s2);printf("\t\t");out_seq

2(s3);printf("\t\t用S->D;归约");

pop(2);

top_seql(si,top);

gotol(top,"S");

push_seq2(s3,;

)

elseif(j==-2)

out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq

2(s3)jprintf(,z\t\t用D->intid归约〃);

change(strl,z/int/z);

for(intk=0;k<15;k++)

identiferl[kk].identitype[k]=stri[k];

kk++;

pop⑵;

top_seql(si,top);

gotol(top,〃D〃);

push_seq2(s3,〃_〃);

}

elseif(j==-3)

(

out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq

2(s3);printfC\t\t用D->floatid归约〃);

change(strl,Afloat,z);

for(intk=0;k<15;k++)

identiferl[kk].identitypeLk]=str1[k];

kk++;

pop(2);

top_seql(si,top);

gotol(top,ZZD,Z);

push_seq2(s3,〃_〃);

)

elseif(j==-4)

out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq

2(s3);printf(,z\t\t用D->D,id归约〃);

for(intk=0;k<15;k++)

identiferl[kk].identitype[k]=identiferl[kk-l].identitype[k];

kk++;

pop(3);

top_seql(si,top);

gotol(top,,ZDZ/);

push_seq2(s3,〃_〃);

)

)

elseif(j>0)

actionl(top,getl);

)

)

voidaction2(inti,strings)

(

intpos,j;

if(judge(v2,13,s))

j=address(v2,13,s);

pos=ana1ysis_tab1e2[i][j];

charstr[15];

change(str,s);

out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(/z\t\t,,);out_se

q2(s3);printf(〃\t\t〃);

if(pos==100)

(

cout<〈〃分析成功!〃<<endl;

********************〃<〈end1;

)

else

printf(z,action[%d,%s]=S%d状态%d入栈\n〃,i,str,pos,pos);

push_seql(si,pos);

push_seq2(s2,s);

push_seq2(s3,〃_〃);

getl=in[addr];

addr++;

)

voidgoto2(inti,strings)

(

intpos,j;

if(judge(v2,13,s))

j=address(v2,13,s);

pos=analysis_table2[i][j];

charstr[15];

change(str,s);

printf("goto[%d,%s]=%d\nz,,i,str,pos);

pushseql(si,pos);

push_seq2(s2,s);

voidslr2()

{

t=r;

clear(si,s2,s3);

push_seql(si,0);

push_seq2(s2,〃#〃);

push_seq2(s3,〃_〃);

getl=in[addr];

addr++;

stringp[10];intnum=0;

p[num]=ins[addr-l];num++;

inttop,j;

charstrl[15];

while(1)

(

j=address(v2,13,getl);

top_seql(si,top);

if(top==100)

(

addr一一;

return;

j=analysis_table2[top][j];

if(j>0)

action2(top,getl);

elseif(j<0)

(

if(j==-l)

(

out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq

2(s3);printf(z,\t\t用A->id=E;归约〃);

pop(4);

top_seql(si,top);

goto2(top,〃A〃);

for(inti=0;i<m;i++)

if((screamp(identiferl[i].identiname,p[O]))&&(identiferl[i].ide

ntitype!=NULL))

I

change(strl,identiferl[i].identiname);

emit(z,=z/,E,〃_〃,strl);

push_seq2(s3,strl);

)

)

elseif(j==-2)

(

out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq

2(s3);printfC\t\t用E->E+T归约〃);

pop(3);

top_seql(si,top);

goto2(top,"E");

E1=E;

E=newtemp();

emitEl,T,E);

push_seq2(s3,E);

)

elseif(j==-3)

{

out_seql(si);printf("\t't");out_seq2(s2);printf;out_seq

2(s3);printfC\t\t用E->T归约");

pop(l);

topseql(si,top);

goto2(top,"E");

E=T;

push_seq2(s3,T);

)

elseif(j==-4)

{

out_seql(si);printf("\t\t");out_seq2(s2);printf("\t\t");out_seq

2(s3);printfC\t\t用T->T*F归约”);

pop⑶;

top_seql(si,top);

goto2(top,"T");

T1=T;

T=newtemp();

emit("*",Tl,F,T);

push_seq2(s3,T);

)

elseif(j==-5)

{

out_seql(si);printf("\t\t");out_seq2(s2);printf("\t\t");out_seq

2(s3);printfC\t\t用T->F归约");

pop(l);

top_seql(si,top);

goto2(top,"T");

T=F;

push_seq2(s3,F);

)

elseif(j==-6)

{

out_seql(sl);printf(z/\t\tz,);out_seq2(s2);printf("\t\t");out_seq

2(s3);printfC\t\t用F->(E)归约“);

pop(3);

topseql(si,top);

goto2(top,"F");

F=E;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论