编译原理课程设计——算符优先分析法研究——附源程序_第1页
编译原理课程设计——算符优先分析法研究——附源程序_第2页
编译原理课程设计——算符优先分析法研究——附源程序_第3页
编译原理课程设计——算符优先分析法研究——附源程序_第4页
编译原理课程设计——算符优先分析法研究——附源程序_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、1课程设计的目的和要求11课程设计的目的11.2课程设计的耍求12系统描述12.1自底向上分析方法的描述:12.2算符优先文法的描述:13)输入符号串,进行移进-规约分析。23概要设计23设计思路23.2系统功能结构33.3技术路线或实现方法43.4开发环境44详细设计44模块划分44.2 主要算法的流程图64.3数据分析与定义74.4系统界面设计75测试方法和测试结果85.1测试用例185.2测试用例295.3 测试用例31()5.4测试用例4116结论和展望12结论12展望12学习编译技术课程的体会和对本门课程的评价127参考文献128源代码131课程设计的目的和要求1.1课程设计的目的本

2、次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对 编译技术和理论的理解。设计的题目要求具冇一定的规模,应涵盖本课程内 容和实际应用相关的主耍技术。1.2课程设计的要求1、文法使用产生式来定义;2、用大写字母和小写字母分别表示非终结符和终结符;产生式使用3、文法小的空字符串统一使用表示;4、分别给出每一个非终结符的firstvt集和lastvt集;5、画岀算符优先关系表6、判定给定的文法是否是算符优先文法;7、给定符号串判定是否是文法屮的句子,分析过程用分析表格的方式打 印出来。2系统描述木次实验使用windows vista操作系统b visual c+6.0平台,使用c语言, 利

3、用读文件方式将待分析的文法读入到程序屮,通过定义数组和结构体作为 具有一定意义或关系的表或栈,存放firstvt> lastvt、算符优先关系表 的元素。系统能够对由文件读入的文法进行分析,构造出firstvt表和lastvt 表以及算符优先关系表。可以根据构造的优先关系表对输入的任意符号串进 行分析,判断是否为木文法的句了,若是则打印规约过程。结果显示到dos 界面上。2.1自底向上分析方法的描述:对输入的符号串门左向右进行扫描,并将输入符逐个移入栈中,边移入 边分析,一旦栈顶符号串形成某个句型的句柄时(该句柄对应某个产生式的 右部),就用该产生式的左部非终结符代替相应右部的文法符号串

4、,这一过程 称为规约。重复这一过程,直到栈中只剩卜'文法的开始符则分析成功。2.2算符优先文法的描述:只规定算符之间的优先关系,也就是说只考虑终结符之间的优先关系。 由于算富有先分析不考虑非终结符之间的优先关系,在规约过程中只要找到最左素短语就可以规约。如给定一个文法gs:s->#e#e->e+te->tt>t*ft->ff->p/ff->pp-xe)p->i利用算符优先文法分析过程处理如下:1) 计算给定文法中任意两个终结符对(a,b)z间的优先关系,首先计算两个集 合firstvt(b)=blb->b或 b->cb.las

5、tvt(b)=alb->.a 或 b->.ac表 2-1 firstvt 集和 lastvt 集setfpfirstvt#+*/i (*/i (/i(i(lastvt#+*/i)*/i)/i)i)2)计算三种优先关系,求出算符优先关系表:表2-2算符优先关系表+*/1()#+.>< < < < . > >*.> >< < < > >/ > >< < < > >i > > > > >(< < < .< &l

6、t; .).> > > > >#<<< < < 3)输入符号串,进行移进-规约分析。3概要设计3. 1设计思路1)首先在源程序相同的口录下创建一个txt文档,并在文档小输入待分 析的文法。然后定义一个输入流文件,调用这个流文件屮的open函数打开该 txt文件,再定义一个二维数组通过循环接收读入的产生式。2)接着开始构造firstvt. lastvt.算符优先关系表。在构造表的时 候首先定义了两个重要的结构体。一个结构体作为存放具有一定关系的一对 非终结符和终结符,另一个结构体作为存放上述元素的栈,包括栈顶指针、 栈底指针、栈的长度。

7、既然定义了栈,就存在对栈的初始化、栈是否为空的 判断、入栈、出栈操作,利用循坏和指针的操作来定义这些函数,以完成元 素的进栈和弹出。定义了这两个结构体,就可以用來构造firstvt、lastvt.算符优先 关系表。在构造firstvt表时,通过循坏找出每条产生式中的非终结符的 firstvt集,并把该非终结符和终结符压栈,设置标志位,标志一对非终结 符和终结符具有对应关系o lastvt表的构造则是将求firstvt的过程翻转 过來,可以仅仅将函数中的参数稍作修改就能够完成。3)构造算符优先关系表。算符优先关系表是一个二维数组,用來存放任 意两个终结符z间的优先关系。首先构造表头,通过扫描所有

8、产生式将终结 符不重复的存放在一个一维数组中并置为优先关系表的行和列,并将优先关 系表其他内容全部初始化为空。接着遍历所有产生式,找出任意两个终结符 z间存在的关系(可以没有关系),并判断任意两终结符是否至多存在一种优 先关系,如发现优先关系表不为空,则证明该文法不是算符优先文法,否则, 将相应的关系填入到相应的行列对应的单元中。4)输入申分析过程的设计。首先将大于、小于、等于和无关系分别定义 成一种类型的数据表示,通过查询符号栈栈顶以及当前符号之间的优先关系 來判断移进和规约的操作。3.2系统功能结构图31系统功能结构图函数功能:main()函数:调用主函数,运行程序;firstvt()函数

9、:构造 firstvt 表;lastvt()函数:构造 lastvt 表;oppriotable()函数:构造算符优先关系表;input analyse。函数:分析输入串是否为文法中的句了,并给出规约过程。3.3技术路线或实现方法算符优先分析法的具休过程如下:1、首先先输入文件的路径,在readfile(char sencol)函数中,将需要分 析的文法通过输入流文件打开函数open()复制到senrowcol中。2、然后利用firstvt()构造产生式senrowcol的firstvt表。先找岀形如 a->-a- (a为第一个终结符)的产生式,把(a,a)压入operator栈中。从

10、operator栈顶抛出项(a, a),填入first表相应位置。在找出形如b>a的 产生式,把(b,a)压入operator栈屮。循环直到operator栈为空,此时firstvt 表构造完毕。3、然后把产生式右部翻转,调用firstvt函数求lastvt表。4、接着调用oppriotable ()构造算符优先关系表optable。先把产生式 中所有终结符填入optable表第一行和第一列,然后利用产生式和firstvt表 lastvt表分别找岀满足二关系、v关系、>关系的算符填表。若相应位已有关系, 说明两个终结符之间至少有两种优先关系,该文法不是算符优先文法。5、最后调用in

11、putanalyse ()对输入串进行分析。初始化分析栈s,依 次判断当前输入符a和分析栈中离栈顶最近的终结符sj 的关系,若sj< a,则a移近,若sj<a,则往前找到第一个sj>a,将sjl到栈顶sk 规约,若sj=a ,如果sj=#,则接受,如果sj! =#,则移进。直到接 受或者出错,算符优先分析结束。3.4开发环境实验使用windows vista操作系统下的microsoft visual c+ 6.0平台,用c 语言完成。4详细设计4.1模块划分实验分为五个模块,分别是:1、文件的导入:readfile (senfl);2、firstvt> lastvt

12、集的构造:firstvt (sen,first,sen_len,frist_len);lastvt (sen,last,sen_len5frist_len);3算符优先关系表oppriotable的构造:oppriotable (sen,first,last5optable5sen_len,first_len,&optable_len);4、算符优先分析过程的实现:inputanalyse (optablecol,stringcol,optable_len);5> 主函数:main ()。4.2主要算法的流程图图4算符优先分析法程序流程图4.3数据分析与定义1、文法(产生式):文

13、法使用产生式来定义char senrowcol:用二维数组表示产牛式;int senjen:产生式的个数;2、firstvt 集:char firstrowcol:用二维数组构造 firstvt 表int fristjen: firstvt 表的行数;3、lastvt 集:char lastrowcol:用二维数组构造 lastvt 表;int fristjen: lastvt 表的行数;4、算符优先关系表:char optablerowcol:用二维数组表示算符优先关系表; int optable_len:算符优先关系表的行数和列数;5、算符优先分析表char stringcol:用一维数组

14、记录输入串; charssize:用一维数组表示分析栈; char a:当前输入字符;6、其他数据结构:typedef structchar nonterm;非终结符char term;终结符stackelement;firstvt表或lastvt表中一个表项(a,a);7、typedef structstackelement *top;stackelement bottom;int stacksize; stack;以形如表项(a,a)为元索的栈,在构造firstvt集的过程中用到;4.4系统界面设计本实验没冇考虑界面设计,将结果直接打印输出在dos界面下。5测试方法和测试结果5.1测试用例

15、1测试目的:使用算符优先分析法对一个算符文法中的旬了进行分析。读入一个算符优先文法进行分析,给出文件路径d:coursesc_source_file成品算符优先文法 l.txt。结杲如卜:图5-1测试用例1运行截图1输入一个字符串,使得该字符串是该文法的一个句子。则输入字符串i+i*i/(i+i)#时运行结果为:同.d:coursesc_source_file成品debug算符优先exett * * /<<>1<n a< <<>><<<><*>>><<></>&g

16、t;><<><<<<<<=<>>>>>>駕备人析話串,以”结束:i+i*i/<i+i>tt分析过程如下:栈n hi un un* ttn*i itn+n un*n* ttn*n*i ttn*n*n ttn*n*n/ hn*n*n/< «n*n*n/<i bn*n*n/<n ttn*n*n/<n* ttn*n*n/<n*i ttn+n*n/<n*n ttn*n*n/<n ttn*n*n/<n> ttn+n*n/n un*

17、n*n ttn*nun杲否继续?"介当前字符1.ttu tt it tt剩i余符号串*i*i/<i*i>tti*i># *i>tt i>#i>tt>ttttu优先关系约进约进进约进进约进进进约进进矽爭进约约约彎 规移归移移归移移归移移移归移移*ij<1j移归归归归接 或# * * < / * * tt进移图5-2测试川例1运行截图25.2测试用例2测试目的:使用算符优先分析法,分析一个字符串不是该文法的句子,并 输出出错信息。输入一个字符串,使得该字符串不是文法的句子。ict .d:coijrsesc_source_file诚品&

18、#39;debug雷符优先exe,#*/<>!« = <<<< <*>><<<><*>>><<></>>><<><c <<<<=<> > > > > >析备串,以韓结束:分析过程如下:栈当刖字符剩余符号串优先关系tti<tti/>un/<un/1+i*<i+i*/u<ttn/i>ttn/n>ttn<ttn*

19、1<ttn*i>ttn+n<<<ttn+n*<1<ttn*n*<ii*/tt>bn*n*<ni*/tt<ttn+n*<n+1<ttn*n*<n*i/#>bn*n*<n*n*/#<ttn+n*<n+n*/tt<ttn*n*<n*n*/tt>ttn*n*<n*n«nn>ttn*n*<n*nn>ttn*n*<nn岀错融滞有错1一约进约进进约约进进约进进进约进进约进进够矽约 一规移归移移归归移移归移移移归移移归移移刈m归 一或# /tt

20、* < * < 一进_多图5-3测试用例2运行截图5.3测试用例3测试目的:读入一个文法,判断该文法不是算符优先文法。读入一个非算符优先文法进行分析,给出文件路径:d:coursesc_source_file成品非算符优先文法l.txt。运行结果如下:图5-4测试用例3运行截图5.4测试用例4测试目的:输入一个非算符文法,判断该文法不是算符文法。读入一个非算符文法,给出路径:d:coursesc_source_file成品|】算符文法txt°运行结果如下:图55测试用例4运行截图6结论和展望结论本次实验我们基本完成了实验题廿的要求。求出了一个文法中每一个非 终结符的fir

21、stvt集和lastvt集,画出算符优先关系表,并判定岀给定的 文法是否是算符优先文法。当给定一个符号串吋,能够判定是否是文法中的 句子,并能够将分析过程打印出來。通过算符优先分析方法,可以对任意一 个文法进行自底向上的分析。同吋,算符优先分析法也存在不足之处,由于 忽略文法中的非终结符,会将本不属于文法的句子正确规约,从而引起错误。 展望本次实验完成了题目的要求,准确把握了将文法通过读文件形式、手动 输入分析字符串的题目要求,并在满足要求的基础上进行了创新,添加了对 算符文法的判断功能。实验中,小组成员的分工与合作充分体现了软件工程 的思想。需求分析理解准确,小组成员任务明确,统一函数头、参

22、数,各自 完成分内工作,整合工作快速、高效。同时,实验小述存在很多不足。调试程序小的错误占用了大部分时间, 以至于没有考虑使用界而展示结果。虽然使用c+开发工具,但实质上述是 在使用c编代码。在今后的实践屮述需注意。学习编译技术课程的体会和对本门课程的评价在上编译课的时候,小组成员都觉得口己对算符优先文法已经掌握了, 但等真正用程序去实现时,才发现有很多细节我当吋没有注意到。也正以为 没有注意到这些细节,导致成员们编程吋会击现各种错误,大部分都是在循 环时下标或者循环次数的控制上出错。在进行到一定阶段后发现犯的低级错 误越来越少了,对算符优先文法也愈发的吃透了,编程水平也有了进一步的 提高。编

23、译原理如果要深入研究,那会是一门非常深奥的学问,对于现阶段只 有60多学吋的木科生来说,只能涉及到它一些最基木的原理,和最宏观的方 法,要想微观的去研究,还需要在以后的吋间里去钻研。在这次实验屮,小 组成员也只是用高级语言模拟了编译的一个小方法,在完成实验的过程中, 小组成员对编译原理有了进一步的了解,更提高了动手编程能力,是一次经 验和知识的积累。7参考文献1张素琴编译原理(第2版)m.北京:清华大学出版|±, 2005.6, 102-121.2陈维兴.c+面向对象程序设计教程m.北京:清华大学出版社,2004.8, 258-272.8源代码#i nc lude<iostre

24、a m. h>#include<stdlib.h>#include <fstream.h>#define row 5()#define col 50#define size 50两个重要结构体的定义/firstvt表或lastvt表中一个表项(a,a)结构体的初始化typedef structchar nonterm;非终结符char term;终结符jstackelement;存放(a,a)的栈的初始化typedef structstackelement *top;stackelement bottom;int stacksize;stack;/初始化(a,a)

25、栈void initstack(stack &s)s.bottom = new stackelementlsizej;if(!s.bottom)cout«"存储空间分配失败!" «endl;s.top = s. bottom;s.stacksize = size;判断(a,a)栈是否为空bool ifempty(stack s)if(s.top=s.bottom) return true;如果栈为空,则返回 trueelse return false;否则不为空,返回 false插入栈顶(a,a)元素void insert(stack &

26、s,stackelement e)if( s. top-s .bottom>=s. stacksize)coutvv"栈已满,无法插入! "vvcndl; elses.top->nonterm=e.nonterm;s .top->term=e.term;s.lop+;弹出栈顶(a,a)元素stackelement pop(stack &s)stackelement e;e.nonterm =e.term = 'o'if(s. top=s.bottom)cout«n栈为空,无法进行删除操作! “vvendl; return

27、e;elses.top-;e.nonterm=s.top->nonterm;e.term=s top->term;return c;终结符与非终结符的判断函数(布尔类型)bool terminaljud(char c)if(c>a&&cv=z)return false;非终结符返回 falseelse return true;终结符返回 true判断非终结符在first表中是否已存在bool itemjud(char firstljcolj,int frist_len,char c)for(int i=o;i<frist_len;i+)if(firsti

28、lo=c)return true; 如果first表中已存在此非终结符,则返回truereturn false;读文件函数int readfile(char senfcol)char addr50;cout«h请输入要读文件的地址(用表示):h«endl;cin»addr;ifstream fin;fin.open(addr,ios: :in);if(!fin)cout«mcannot open file!nn«endl;for(int i=0;!fin.eof();i+)fin»senij;cout«sen i«

29、endl;return i;/firstvt表和lastvt表中表项(非终结符)的初始化void itemlnit(char sencol,char firstcol,char laslcol,int sen_len,int &frist_len)inti;frist_len=l;firstoo=senooj;last00=scn00;for(i= 1 ;i<sen_len;i+)if(terminaljud(seni()=false && itemjud(first,frist_len,seni()=false) /k是当前first和last表的长度first

30、frist_len l0=seni oj;lastfrist jenl o=seni 0; frist_lcn+;void firstvt(char sencolj,char firstcol,int sen_len,int fristjen) / fristjen 是 first 表的行数sen.len是产生式的个数stackelcmcnt dfs,recordsize;stack operator;创建存放(a, a)的栈initstack(operator);int i,j,r=();for(i=0;i<sen_len;i+)笫一次扫描,将能直接得出的first (a, a)放进栈

31、中for(j=3;senrij!=,(),;j+)if(terminaljud(senlijjj)=true)遇到的笫一个终结符压入int exist=();dfs .nontcrm=scn i 0;dfs. term=sen i j ;for(int i 1 =0;ivr;i+)if (record il.nonterm=sen i0 & & record i 1 . term=sen i j )exist=l;break;record r .nontcrni=scn i 0;record r.term=senij;if(exist=0)insert(operator,dfs

32、);/a-ab a-ac (a,a)压栈两次?record r .nonterm=sen i0;recordlrj.term=senijjj;r+;break;int locationcolj;辅助数组,用來记录first表中放入终结符的位置for( i=o;i<fri st_len; i+)locationi=l;while(!ifempty(operator)int exist=o;标志位,记录即将入栈的元素是否已经存在stackelement idelement,delement;delement=pop(operator);弹出栈顶元素for(i=0;i<frist_len

33、;i+)if(firstio=delement.nonterm)int n=locationij;firstiln=delement.term;将终结符填入相应的first表屮locationi+;break;for(j=0;j<sen_len;j+)if(senj=delement.nontcrm)找出能推出当前非终结符的产生式的左部idelement.nonterm=senjl();idelcmcnt.tcrm=delcmcnt.tcrm;判断将耍放进栈里的元素曾经是否出现过,若没有,才压入栈 for(int r()=();r()<r;rt)+)i记录 record 数组屮的元

34、素个数&&record ro term=idelemen t. term)/firstvt 表与 lastvt就可以用求first的方exist=l; break;if(exist=o)insert(operator,idelement); recordrj.nonterm=ldelement.nonterm; recordr.term=ldelement.term;r+;/if/for/while void lastvt(char sencol,char iastcol,int scn_lcn,int fristjen) 表行数一样first_len表示last表的彳亍数in

35、t i,j,il,jl;char c,recordrow col=0r;for(i=0;i<scn _len;i+)for(j=0;seni j j !=0,;j+)recordij=senij;for(il=3,jl =j;il<jl;il +,j 1 -)做翻转,法求lastc=recordijlil j;recordiil =recordij 1; record i j l=c;/forfirst vt(recordast,sen_len,fris(_len);判断非终结符在term表中是否已存在bool termtablej ud(char term col ,i nt t

36、erm_len,char c)for(int i=o;i<tcrm_lcn;i+)if(termij=c)return true; 如果first表中已存在此非终结符,则返回1return false;构造算符优先关系表bool oppriotablc(char scncol,char firstcol,char lastcol,char optablccol,int sen_len,int first_lenjnt &o ptable_len)int i,j,termjen=o;int i2,i3,opr,opc;char cl,c2,c3;char termsize=,0,;

37、for(i=();i<sen_len;i+)一维数纟h. term记录关系表屮存在的所有终结符for(j=3;senij!=,0,;j+)if(terminaljud(seni j)=true) if(termtablejud(term,term_len,senfij)=false) /term_len 记录 term 表的氏度term termen=senij;term_len+;)给优先关系表赋初值,都等丁空设這优先关系表的表头/得到终结符表for(i=0;i<term _len+l ;i+) for(j=0;j<termen+l ;j+) optableifj=,:fo

38、r(i= 1 ;i<termen+1 ;i+)optablei o=termi-1 ; optable0 i=termi-1 ;for(i=0;i<sen_len;i+)找等于关系for(j=5;seni j !=or;j+)if(terminal jud(seni j-2)=true&&terminaljud(senij-l )=falsc&&tcrminaljud(scn ilj)=tnie)cl=senij-2j; c2=senirj;for(opr= 1 ;opr<term_len+1 ;opr+)在 optable 表中找到该存入的行

39、标oprif(optableopr0=cl)break;for(opc= 1 ;opc<term_len+1 ;opc+)在 optable 表屮找到该存入的列标opcif(optable0 opc=c2)break;if(optableopropc !='')cout«n不是算符优先文法1 "«endl;return false;elseoptableloprjlopc='/if/foro)for(j=4;senij!=,0,;j+)if(terminaljud(senij-l)=true&&terminal j u

40、d(sen i j 1 )=true)cl=senij-l;c2=seni|jj;for(opr= 1 ;opr<tcrmcn+1 ;opr+)在 optablc 表中找到该存入的行标oprif(optableopr loj=c 1)break;for(opc= 1 ;opc<term_len+1 ;opc+)在 optable 表中找到该存入的列标j2if(optable0opc=c2)break;if(optableoprjopc!='')cout«"不是算符优先文法! "«endl;return false;elseop

41、tablcopropc='=')/for(i)for(i=0;i<sen_len;i+)找小于关系for(j=3;senij!='()'j+)if(terminalj ud(seni j )=tiiie&&terminaljud(senij + l)=false)cl二senij;/cl 记录终结符c2=scnij+l;/c2 记录非终结符for(opr= 1 ;opr<term_len+1 ;opr+)在 optable 表中找到该存入的行标oprif(optablcopr 0=c 1)break;for(opc=0;opc<

42、first_lon;opc+)找出非终结符在 first 表中的列标opcif(firstopc j 0j=c2)break;for(i2=l;firstopci2!='0'i2+)c3=firstopci2;for(i3=l ;i3<term_len+l ;i3+)if(optable0i3=c3)if(optableoprjli3!='')cout«h不是算符优先文法! "vvendl; return false;elseoptableopri3=,<,;break;/if/foro)/for(i)for(i=0;i<s

43、en_len;i+)找大于关系for(j=3;senij!=,0,;j+)if(terminaljud(senij)=false&&seni|j-+-l!='0 '&&terminaljud(seni j+1 )=true) c 1 =senij;/c 1记录非终结符c2=senijj+ij;/c2 记录终结符入的列标jl的行标j2for(opr= 1 ;opr<tcrm_lcn+1 ;opr+)if(optableoj oprj=c2)break;for(opc=0;opc<first_len;opc+)if(lastopc01=c

44、l) break;在optablc表中找到该存找出非终结符在last表中for(i2= 1 ;lastopc i2 !='0'i2+)c3=lastopci2;for(i3=1 ;i3<term_len+1 ;i3+) if(optablei3joj=c3)if(optablei3opr!=' *)cout«h不是算符优先文法! "vvendl; return false;else optablei3 opr='>'break;)/if/for(j)/for(i)optable_len=term_len+1;rctum t

45、rue;判断两算符优先关系并给出类型供构造分析表int relationshipjud(char cl,char c2,char optablecol,int optable_len)int i,j;for(i= 1 ;i<optable _len;i+)if(optablei0=cl)break;for(j= 1 ;j<optable_len;j+)if(optable0j=c2)break;if(optableilj ='<*)return 1;else if(optableij ='=')retum 2;else if(optableij=,&g

46、t;,)return 3;else rctum 4;判断输入串是不是优先文法bool priogramjud(char senffcol,int sen_len)int i,j;for(i=0;i<sen_len;i+)for(j=4;senij!二'()'j+)if(terminaljud(seni j-1 )=false&&terminaljud(senij)=false)coutvv”输入的不是算符文法!"«endl;return false;return true;开始分析输入串void inputanalyse(char op

47、tablecollchar stringfcol,int optablejen) /optablejen 是 optable表的长度char a,q,ssize=、o'/s 是分析栈 char chol,cho2;int i,j,relation;int k=0;sk=#;cho2='y'cout«"tttt 分析过程如下:"vvcndl;coutvv""«cndl;/cout«°栈t当前字符t优先关系t移进或规约h«endl;/coutvv"分析过程如卜:"&

48、#171;endl;cout.width(lo);cout«"栈";cout.width(15);coutvv”当前字符”;cout.width(20);cout«n剩余符号串“;cout.width(15);cout«h优先关系”;cout.width(15);coutvv"移进或规约"vvendl;char* p;p=string;p+;for(i=0;stringi !=0 '&&cho2='y'i+,p+)a=stringi;读入当前字符chol='n'可否接受

49、while(chol='n')if(tcrminaljud(sk)=truc) j=k;规约使栈内冇非终结符else j=k-l;relation=relationshipjud(sjj,a,optable,optable_len); if(relation=3)/s|j>a/coutvv“ ”vvsvv“t“vv”m«a«httcout.setf(ios:left);cout.width(lo);cout«s;cout.unsctf(ios:lcft);cout.width(15);cout«a;cout.width(20);co

50、ut«p;cout.width(15);cout«n>m;doq=suj;if(terniinaljud(sj-l)=true) j=j-1;else j=j-2;while(relationshipj ud(s j ,q,optable,optable_len) != 1); /cout«u "«sj«u 归约 h«endl; cout.width(ll);cout«sjj;cout.width(4);cout«"归约"«cndl;k=j+l;sk二 n;for(int l=k+l;l<size;l+)sri=(y;else if(relation=l)/sj<a移进 h«endl;choly:/cout«m h«s«,t,«m m«a«ntt <tt cout.setf(ios:left);cout.width(lo);cout«s;cout.u

温馨提示

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

评论

0/150

提交评论