1、所以就选择参照书上的内容自己动手,词法分析的思路基本上和书上的一样对每个词进行分析编号。但是由于书上内容复杂,所以我只做了赋值语句的顺序处理部分。而且和书上的赋值语句相比我有加了减法和除法的功能。并且在读取阶段,书上是按行读取(读到”n”为一个readline),而我选择了按语句进行读取(读到”;”为一个readline)。因为有时候一行之间会有好几个语句。我可以把一行上的多个语句分开来,当然书上也可以只不过这一步她是在程序语句处理里面完成的。而我只有赋值语句。并且还要实现顺序结构所以就按照自己的思路做下去了。 然后是语法分析,由于词法分析和书上的有出路。所以一开始我就没打算用书上的思路去做。
2、就按照自己的思路来解决,首先是对词法分析里的存储单词的数组进行拷贝和修改(添加了#号使其能区分出赋值语句)、然后正式的语法分析时,我是直接对拷贝后的数组进行分析的,中间出了不少错误,更关键的是语法分析时在顺序上出现了错误,这一点我无法用语言说清楚,解决顺序上的错误时我加入了add1()这个函数,同时这个函数也实现了将终结符改为非终结符的功能(也就是所谓的临时变量)。然后就是一个语句分析完后进行下一个语句的分析。这个就是个衔接问题,改动数组的坐标就能完成,大概的思路就是这样,中间调试时错误百出,对语法分析程序做了不少的小动作。然后就是将语法分析结果显示出来,为了和课本的相似,用了几个条件语句做约
3、定。这个是第二天上午解决的,思考了一会。当然最关键的核心技术,还是和书上的一样。符号种别编码说明Pound_sign7“#”add34“+”sub35“-”mul36“*“div37“/”equal38“=”lbrackets48“(“rbrackets49“)”tempsy55临时变量ident56变量intconst57整常数单词符号的内部定状态ACTIONGOTOi+-*/()#ES3S2S4S5S6S78R69101112S13R1R2R3R413R5算符运算SLR(1)分析表七源程序及运行结果#includefstreamstring.husing namespace std;#de
4、fine txtname C:bianyiqi.txt#define ACC -2/-字符定义-#define pound_sign 7 /“#”#define add 34 /“+”#define sub 35 /“-”#define mul 36 /“*“#define div 37 /“/”#define equal 38 /“=”#define lbrackets 48 /“(“#define rbrackets 49 /“)”#define tempsy 55 /临时变量#define ident 56 /变量#define intconst 57 /整常数/-变量申明-char c
5、h=0; /读取字符int count=0; /计buf里的单词个数static char spelling10=; /读取一个变量static char line255= /单词字符数组char *pline; /单词指针int lnum=0; /行数int nlength=0; /所产生的变量编号static char ntab110010; /存放新的变量并进行比较struct aa int sy1; int pos;buf1000,n,n1,E,sstack100,ibuf100;int tt1=0;int stack1000; /栈int sp=0; /栈的位置数int ii=2;
6、/ibuf数组的位置数int lr; /状态序列int j=0; /ibuf总个数int h=1; /控制”#结束#”的个数函数ifstream infile;/-语法分析表-int action149=3,-1,-1,-1,-1,2,-1,-1,1, -1,4,5,6,7,-1,-1,ACC,-1, 3,-1,-1,-1,-1,2,-1,-1,8, -1,106,106,106,106,-1,106,106,-1, 3,-1,-1,-1,-1,2,-1,-1,9, 3,-1,-1,-1,-1,2,-1,-1,10, 3,-1,-1,-1,-1,2,-1,-1,11, 3,-1,-1,-1,-
7、1,2,-1,-1,12, -1,4,5,6,7,-1,13,-1,-1, -1,101,101,6,7,-1,101,101,-1, -1,102,102,6,7,-1,102,102,-1, -1,103,103,103,103,-1,103,103,-1, -1,104,104,104,104,-1,104,104,-1, -1,105,105,105,105,-1,105,105,-1;/-字符读取-void readline() char ch1; pline=line; infile.get(ch1); while(ch1!= *pline=ch1; pline+; infile.
8、get(ch1); *pline=NULL;void readch() if(ch=NULL) readline(); lnum+; ch=*pline; pline+;/-变量识别-int find(char spel) int ss1=0; int ii=0; while(ss1=0)&(iia)&(ch09); pline-; spellingk= bufcount.sy1=ident; j=find(spelling); if(j=-1) bufcount.pos=tt1; strcpy(ntab1tt1,spelling); tt1+; nlength+; bufcount.pos=
9、j; count+; for(k=0;k); bufcount.sy1=intconst; bufcount.pos=ivalue;/-词法分析-void scan() while(ch! switch(ch) case :break;bcdefghijklmnopqrstuvwxyidentifier(); break;12345678number();+bufcount.sy1=add; count+;-bufcount.sy1=sub;*bufcount.sy1=mul;/bufcount.sy1=div;bufcount.sy1=equal;(bufcount.sy1=lbracket
10、s;)bufcount.sy1=rbrackets; bufcount.sy1=-1; /全部读完最后一个赋值为-1/-void disp2(aa k) switch(k.sy1) case 34:cout+endl; case 35:- case 36:* case 37:/ case 38:= case 48:( case 49:) case 55:临时变量 case 56:变量tntab1k.pos case 57:整常数void disp1() int i; coutendl-词法分析结果- for(i=0;icount;i+) coutbufi.sy1bufi.pos disp2(b
11、ufi);程序总共lnum行,产生了count个二元式-变量名表-tt1;ntab1ivoid disp3()状态: for(int i=0;=sp;stacki /-与分析表匹配-int change(int n) switch(n) case ident: case intconst:return 0; case add:return 1; case sub:return 2; case mul:return 3; case div:return 4; case lbrackets:return 5; case rbrackets:return 6; case pound_sign:ret
12、urn 7; case tempsy:return 8;/-词法分析数组转化为语法分析数组-void exchange() if(bufi-1.sy1=ident&bufi.sy1=ident) ibufj.sy1=pound_sign; j+; ibufj.sy1=bufi.sy1; if(bufi.sy1=ident) ibufj.pos=bufi.pos; j+; ibufj.sy1=pound_sign; j+; ibufj.sy1=-1;=j;ibufi.sy1=i;n-) ibufn+1.sy1=ibufn.sy1; ibufn+1.sy1=tempsy;/-语法分析-void l
13、rparse() lr=actionstackspchange(ibufii.sy1);/ coutstackspchange(ibufii.sy1) if(ibufii.sy1!=tempsy) disp3(); if(lr=0) sp+; stacksp=lr; if(ibufii.sy1!=tempsy&lr!=ACC) cout移进/ cout#ibufii.sy1100&lr107) switch(lr) case 101:sp=sp-3; add1(ii); ibufii.sy1=tempsy;归约EE+E break; case 102:归约EE-E case 103:归约EE*
14、E case 104:归约EE/E case 105:归约E(E) case 106:sp=sp-1;归约Ei if(lr=ACC) sp=sp-1; if(h=1)/ disp3();#结束 h=2; if(ibufii+1.sy1!=-1) stacksp+1=0; ii=ii+3; h=1; lrparse(); else return;/-int main() infile.open(txtname,ios:in); readch(); scan(); disp1(); exchange(); stacksp=0;-语法分析- lrparse(); infile.close(); return 0;运行结果:1.使用的语句是d=(a+b)/c;这里的 号是用来结束用的实际分析的
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1