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

下载本文档

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

文档简介

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

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

3、vista操作系统下visual C+6. 0平台,使用C语言,利 用读文件方式将待分析的文法读入到程序中,通过定义数组和结构体作为具有一定意义 或关系的表或栈,存放FIRSTVT、LASTVT、算符优先关系表的元素。系统能够对由文件读入的文法进行分析,构造出FIRSTVT表和LASTVT表以及算符 优先关系表。可以根据构造的优先关系表对输入的任意符号串进行分析,判断是否为本 文法的句子,若是则打印规约过程。结果显示到DOS界面上。2.1 自底向上分析方法的描述:对输入的符号串自左向右进行扫描,并将输入符逐个移入栈中,边移入边分析, 一旦栈顶符号串形成某个句型的句柄时(该句柄对应某个产生式的右

4、部),就用该产生 式的左部非终结符代替相应右部的文法符号串,这一过程称为规约。重复这一过程,直 到栈中只剩下文法的开始符则分析成功。2.2 算符优先文法的描述:只规定算符之间的优先关系,也就是说只考虑终结符之间的优先关系。由于算富 有先分析不考虑非终结符之间的优先关系,在规约过程中只要找到最左素短语就可以规约如给定一个文法GS:s->#E#E->E+TE->TT->T*FT->FF->P/FF->PP-> (E)P->i利用算符优先文法分析过程处理如下:1)计算给定文法中任意两个终结符对(a, b )之间的优先关系,首先计算两个集合FIRS

5、TVT(B) = b B- >b-或 B->Cb.LASTVT (B) = a B- >-a 或 B->aC表 2T FIRSTVT 集和 LASTVT 集SETFPFIRSTVT#+*/i(*/i(r /i (i(LASTVT#+*/i)*/i)/i)i)2)计算三种优先关系,求出算符优先关系表:表2-2算符优先关系表+*/ 1()#+.>V.V.V.V.>.>*.>.>V.V.V.>.>/.>.>V.V.V.>.>I.>.>.>.>.>(V.V.V.V.V.).>.

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

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

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

9、系统功能结构图函数功能:Ma in()函数:调用主函数,运行程序;FirstVt ()函数:构造 FIRSTVT 表;LastVt ()函数:构造 LASTVT 表;OpPrioTable ()函数:构造算符优先关系表;In putA nalyseO函数:分析输入串是否为文法中的句子,并给出规约过程。3.3 技术路线或实现方法算符优先分析法的具体过程如下:1、首先先输入文件的路径,在read sen col)函数中,将需要分析的文法通过输入流文件打开函数open。复制到sen row col中。2、 然后利用FirstVt ()构造产生式sen row col的FirstVt表。先找出形如A-

10、>&( a为第一个终结符)的产生式,把(A, a)压入Operator栈中。从Operator 栈顶抛出项(A, a),填入first表相应位置。在找出形如B->A的 产生式,把(B, a) 压入Operator栈中。循环直到Operator栈为空,此时FirstVt表构造完毕。3、 然后把产生式右部翻转,调用FirstVt函数求出LastVt表。4、接着调用OpPriotable。构造算符优先关系表opTable。先把产生式中所有 终结符填入opTable表第一行和第一列,然后利用产生式和FirstVt表LastVt表分别找出满足二关系、关系、>关系的算符填表。若相

11、应位已有关系,说明两 个终结符之间至少有两种优先关系,该文法不是算符优先文法。5、最后调用InputAnalyse ()对输入串进行分析。初始化分析栈S,依次判断 当前输入符a和分析栈中离栈顶最近的终结符S j 的关系,若$ j < a,则a移 近,若S j > a,则往前找到第一个S j >a,将S j -1到栈顶S k 规约, 若S j = a,如果S j =#,贝U接受,如果S j ! =#,贝U移进。直到接受或 者出错,算符优先分析结束。3.4 开发环境实验使用windows vista操作系统下的Microsoft Visual C+ 6.0平台,用C 语言完成。4

12、详细设计4.1 模块划分实验分为五个模块,分别是:1、文件的导入:read口);2、FirstVt> LastVt 集的构造:FirstVt (sen, first ,sen J en, frist_len );LastVt (sen 口, last 叩,senen, frist_len);3、算符优先关系表OpPriotable的构造:OpPriotable (sen, first, last, opTable, sen_len, first_len, &opTable_len;4、算符优先分析过程的实现:InputAnalyse( opTablecol, stringcol,

13、 opTable_len);5、主函数:main() o4.2主要算法的流程图图4-1算符优先分析法程序流程图4.3数据分析与定义1、文法(产生式):文法使用产生式来定义char senrow col:用二维数组表示产生式;int sen_le n:产生式的个数;2、FIRSTVT 集:char first row col:用二维数组构造 FIRSTVT 表int first_len: Firstvt 表的行数;3、LASTVT 集:char last row col:用二维数组构造 LASTVT 表;int frist_len : LASTVT 表的行数;4、算符优先关系表:char opT

14、ablerow col:用二维数组表示算符优先关系表;in t opTable_le n:算符优先关系表的行数和列数;5、算符优先分析表char stringcol:用一维数组记录输入串;char S SIZE:用一维数组表示分析栈;char a当前输入字符;6、其他数据结构:typedef struct(char non term; / 非终结符char term;终结符StackEleme nt;FIRSTVT表或LASTVT表中一个表项(A, a);7、 typedef struct(StackEleme nt *top;StackEleme nt "bottom;int st

15、acksize;stack;以形如表项(A, a)为元素的栈,在构造FirstVt集的过程中用到;4.4 系统界面设计本实验没有考虑界面设计,将结果直接打印输出在 DOS界面下5测试方法和测试结果5.1 测试用例1测试目的:使用算符优先分析法对一个算符文法中的句子进行分析。读入一个算符优先文法进行分析,给出文件路径成品算符优先文法l.txt。结果如下:图5-1测试用例1运行截图1输入一个字符串,使得该字符串是该文法的一个句子。则输入字符串i+i*i/(i+i)#时运行结果为:TT .(>c(Mjr5e5C_5ourceJik®5Debug算特itStexe.It */<&

16、gt;! »-«« <卜Hnn+i 4IN+N »H+N* 4IH+N*1W+hl»H )»N+N*Nz(i Z1N+Na(N »N+hl*Nz(N+ HN+NMZtN+i tiN+NkNzcN+H «N+NMN/AN «N+N*N/(N) AN+N*N/N9N+NH1 UN+M kfN杲杏缱努? W”弁析用昙如下:雨11脩持号生i*iz<l+l>#*1Z<1+1>U iz<l+l>#iz<l+l>U zci+i>#<1+1># i+

17、i>tt+i>#i>n1>4 >«0A优先¥系勺乂 掩图5-2测试用例1运行截图25.2 测试用例2测试目的:使用算符优先分析法,分析一个字符串不是该文法的句子,并输出出 错信息。输入一个字符串,使得该字符串不是文法的句子临先关系羲,渝人要分析的串”仪*结真:i/i +wi*<栈具i,中J TNziUNzH 4th 4th* 4lh*i 4lh*H 4lh-«N- 41N->N*<41N*N*<H当前宇特分杭堆如下锁徐符号串A|+i»<l+i*Z4ii+i«<d+i*zii+i&

18、#187;<i+i*zttCi+i*ztt4tN*N*<NAN4tfONn<H 咖呻#N*M*<N 中 itN*N»*<N #1 w者fl tltt出错*L»z« L*ztt L-/U*zlt ZU z#It优先关系c/V到幅 人理勺 微津勺 移进图5-3测试用例2运行截图5.3 测试用例3测试目的:读入一个文法,判断该文法不是算符优先文法。读入一个非算符优先文法进行分析,给出文件路径:成品非算符优先文法l.txt。运行结果如下:SB 1 D:coursesC.source.fik 不 Dzbug'VW"先号输入要读

19、文件约地址(、用表示)、1C C、 C C G 一kC 4 f 1 1 d L 1、5cu C_a o”<! 2,i 1 会 成晶、兀 £794七先文在1 . t *t >UStt->hAh-MB->a->Aa>各韭终结符P】RSI UT隼各非博范的US7UT集不臬茸符优先七法I卓否臻绿q/图5-4测试用例3运彳了截图5.4 测试用例4测试目的:输入一个非算符文法,判断该文法不是算符文法读入一个非算符文法,给出路径:文法.txt。运行结果如下:成品非算符国I ' Dcoucur:e_fik"cnD篥答比先1 xg”谙输人燮裱文件的

20、地址4片小表元r1Il T XCC1L1*CL,C ©HUM* F 左 1. W 成启身符交注-* MtE-*E1E-MI->T*F1->FF-JPIFF->PF-JCHF->1输人的不旱算荷立注?是否雄绩? an图5-5测试用例4运行截图6结论和展望结论本次实验我们基本完成了实验题目的要求。求出了一个文法中每一个非 终结符的 FIRSTVT集和LASTVT集,画出算符优先关系表,并判定出给定的文法是否是算符优先 文法。当给定一个符号串时,能够判定是否是文法中的句子,并能够将分析过程打印出 来。通过算符优先分析方法,可以对任意一个文法进行自底向上的分析。同时,

21、算符优 先分析法也存在不足之处,由于忽略文法中的非终结符,会将本不属于文法的句子正确 规约,从而引起错误。本次实验完成了题目的要求,准确把握了将文法通过读文件形式、手动 输入分析 字符串的题目要求,并在满足要求的基础上进行了创新,添加了对算符文法的判断功能。 实验中,小组成员的分工与合作充分体现了软件工程的思想。需求分析理解准确,小组 成员任务明确,统一函数头、参数,各自完成分内工作,整合工作快速、高效。同时:实验中还存在很多不足。调试程序中的错误占用了大部分时间,以至于没 有考虑使用界面展示结果。虽然使用C+开发工具,但实质上还是在使用C编代码。在今后的实践中还需注意。学习编译技术课程的体会

22、和对本门课程的评价在上编译课的时候,小组成员都觉得自己对算符优先文法已经掌握了,但等真正 用程序去实现时,才发现有很多细节我当时没有注意到。也正以为没有注意到这些细节, 导致成员们编程时会出现各种错误,大部分都是在循环时下标或者循环次数的控制上出 错。在进行到一定阶段后发现犯的低级错误越来越少了,对算符优先文法也愈发的吃透 了,编程水平也有了进一步的编译原理如果要深入研究,那会是一门非常深奥的学问,对于现阶段只有60多学 时的本科生来说,只能涉及到它一些最基本的原理,和最宏观的方法,要想微观的去研 究,还需要在以后的时间里去钻研。在这次实验中,小组成员也只是用高级语言模拟了 编译的一个小方法,

23、在完成实验的过程中,小组成员对编译原理有了进一步的了解,更 提高了动手编程能力,是一次经 验和知识的积累。7参考文献1张素琴.编译原理(第2版)M.北京:清华大学出版社,2005. 6, 102-121.2陈维兴.C+面向对象程序设计教程M.北京:清华大学出版社,2004. 8, 258-272.8源代码# in clude<iostream. h># in clude<stdlib. h># in elude <fstream. h># defi ne row 50# defi ne col 50# defi ne SIZE 50两个重要结构体的定义/FI

24、RSTVT表或LASTVT表中一个表项(A, a )结构体的初始化 typedef struct(char non term; / 非终结符char term;/ 终结符StackEleme nt;存放(A, a)的栈的初始化typedef struct(StackEleme nt *top; StackEleme nt "bottom; int stacksize;stack;初始化(A,a )栈void In itStack(stack &S)S. bottom = new StackEleme ntSIZE; if(!S. bottom) cout«存储空间分

25、配失败!"<<e ndl;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 In sert(stack &S, StackEleme nt e)if (S.top-S. bottom二S. stacksize) cout«栈已满,无法插入!e ndl;else(S. top-&

26、gt;non term=e . non term;S. top->term=e. term;S.top+;)弹出栈顶(A, a)元素StackEleme nt Pop (stack &S)(StackEleme nt e;e. non term ='0:e. term ='0'if (S. top二二S. bottom)(cout«栈为空,无法进行删除操作!/z«e ndl;return e;)else(S. top一;e. non term=S. top->non term;e. term=S. top->term;ret

27、urn e;)终结符与非终结符的判断函数(布尔类型) bool Termin alJud(char c)(if (c>='A'&&c<='Z') return false; / 非终结符返回falseelse return true;终结符返回 true)判断非终结符在first表中是否已存在bool Itemjud(char firstcol, i nt frist_le n, char C)ford nt i=0; i<frist_le n;i+)if(firs ti0=C)return true;如果first表中已存在此

28、非终结符,则返回true)return false;)读文件函数int read sen L col)(char addr50;cout<<请输入要读文件的地址(用表示):"«endl;cin> >addr;ifstream fin;fin. ope n( addr, ios: : i n);if(!fi n)(cout<</zCa nnot ope n file! n/z<<en dl;)ford nt i=0; !fi n. eof () ; i+)(fin> >se ni;cout<<se ni&

29、lt;<e ndl;)return i;)/FIRSTVT表和LASTVT表中表项(非终结符)的初始化void Item In it (char sen col, char firstcol,char lastcol, i nt sen_len , i nt &frist_le n)(int i;frist le n=l;first00=se n00;last00=se n00;for(i=l;i<se n_len ;i+)(if(Termi naljud(se ni0)二二false && Itemjud(first, frist_le n, se/kni

30、 0)=false)是当前first和last表的长度firstfrist_le n0=se ni0;lastfrist_le nO=se ni0; frist_le n+;void FirstVt(char sencol, char firstcol, int sen_len, int frist_len) / frist_len 是 first表的行数sen_len是产生式的个数(StackEleme nt DFS, recordSIZE;stack Operator; 创建存放(A, a)的栈In itStack(Operator);int i, j, r=0;for (i=0; i&l

31、t;sen_len; i+)第一次扫描,将能直接得出的first (A , a)放进栈中(for(j=3;se nij!='0'j+)(if (Termi naljud(se n ij)=true)/ 遇到的第一个终结符压入(int exist=0;DFS. non term=se ni0;DFS. term=se nij;for(i nt il=0;i<r;i+)(if (recordLil. non term二二se ni 0 &&recordil. term=se ni j)(exist=l;break;)recordr . non term=se

32、ni0;recordr. term=se nij;if (exist=0)(Insert (Operator, DFS) ;/A-aB A-aC (A, a)压栈两次?recordr. non term=se ni0;recordr. term=se ni j;r+;)break;)int locationcol;辅助数组,用来记录first表中放入终结符的位置for (i=0; i<frist_le n;i+) locati on i=1;while(!ifEmpty(Operator)(int exist=0;标志位,记录即将入栈的元素是否已经存在StackEleme nt IDEl

33、eme nt, DEIeme nt;DEleme nt=Pop(Operator) ;/ 弹出栈顶元素for(i=0;i<frist_le n;i+)(if (first i 0=DEIeme nt. non term)(int n=locati on i;firsti n=DEIement. term;将终结符填入相应的 first表中locati on i+;break;)for (j=0; j<se nen ;j+)(if (se nj 3=DEIeme nt. non term)找出能推出当前非终结符的产生式的左部(IDEleme nt. non term=se nj0;I

34、DEleme nt. term=DEIeme nt. term;判断将要放进栈里的元素曾经是否出现过,若没有,才压入栈for (int r0=0; rO<r;r0+):r 记录 record 数组中的元素个数&&if (record rO. non term=z:IDEIeme nt. non term record rO. term=IDEIeme nt. term)exist=1; break;)if (exist=O)(In sert(Operator, IDEIeme nt);recordr. non term二IDEIeme nt. non term; reco

35、rder. term=IDEIeme nt. term;r+;)/if/for/while)void LastVt (char sen col, char last col, int sen_len, int frist_len) firstvt 表与 lastvt表行数一样first_len表示last表的行数(int i, j, il, jl;char c, record row col=' 0' ;for(i=0;i<se nJ en ;i+)(for(j=0;se nij!='0'j+)(recordij=se nij;)for (il=3, jl

36、=j ; iKjl; il+, jl)做翻转,就可以用求 first 的方法求last(c二record" il;recordiil=recordi jl;recordijl=c;) /forFirstVt(record, last, se nJ en , frist_le n);判断非终结符在term表中是否已存在bool TermTableJud(char termcol, i nt term_le n,char C)(ford nt i=0; i<ter mJ en ;i+)(if (termi=C) return true;如果first表中已存在此非终结符,则返回1)

37、 return false;)构造算符优先关系表bool OpPriotable (char sen col, char first col, charlast col, charopTablecol, i ntsen_len , i nt first_le n, i nt &opTable_le n)(int i, j, term_le n=0;int i2,i3,opr,opc;char cl, c2, c3;for(i=0;i<se njen ;i+) 一维数组term记录关系表中存在的所有终结符char term SIZE = > 0,;(for(j=3;se ni

38、 j !='0' ; j+)(if(Termi naljud(se nij)二二true)if (TermTableJud (term, term J en, seni j)=false) " termj en 记录 term表的长度( termterm_le n=se nfij; term_le n+;)得到终结符表for(i=0;i<term_le n+1 ;i+)给优先关系表赋初值,都等于空for(j=0;j<term_le n+1 ;j+)opTablei0=H;for(i=1;i<term_le n+1 ;i+)设置优先关系表的表头(opT

39、ablei0=; opTable0i=termi-l; for (i=O; i<sen_le n; i+)/ 找等于关系(for(j=5;se nij!- Qf ;j+) (if (Termi naljud(se n i j-2)=true&& Ter mi naljud(se n i j-l)=false&&Termi naljud(se n i j)=true)(c 仁 se n i j-2;c2=se n i j;for (opr=l; opr<term_len+l; opr+)在 opTable 表中找至 U 该存入的行标opr(if (op

40、Tableopr 0=cl) break;)for (opc=l; opc<term_len+l; opc+)在 opTable 表中找至 U该 存入的列标opc(if(opTable0opc=c2) break;)if(opTableopropc!='') !cout«不是算符优先文法!z/«e ndl;return false;) elseopTableopropc二'二'/if/for (j)for(j=4;se nij!- Qf ;j+) (if (Term in aljud(se ni j-l)=true&&T

41、erm in aljud(se ni j)=true) (c 仁 se nE i j-l;c2=se n i j;for (opr=l; opr<term_len+l; opr+)在 opTable 表中找至 U 该存入的行标opr(if (opTableopr 0=cl)break;)for (opc=l; opc<term_len+l; opc+)在 opTable 表中找至 U该存入的列标j2(if (opTable0 opc=c2)break;)if(opTableoprLope!二'')(cout«不是算符优先文法!zz«e ndl;r

42、eturn false;) else!opTableopropc='二:)for for (i=0; i<sen_le n; i+)/ 找小于关系for(j=3;se nij!=' 0' ;j+)if (Term in aljud(se ni j)二=true&& Term in aljud(se ni j+l)=false)c仁sen cl记录终结符c2=seni j+1 ;/c2 记录非终结符for (opr=l; opr<term_le n+1 ;opr+) 在 opTable 表中找至!J该存入的行标 opr if (opTableo

43、pr LO=cl)break;for(opc=0;opc<first_len;opc+)找出非终结符在 first 表中的列标opc(if(firstopc0=c2) break;for(i2=l;firstopci2!=' 0' ;i2+)(c3=firstopci2;for(i3=l;i3<termj en+l;i3+)if(opTable0i3=c3)(if(opTableopri3!='')cout<<不是算符优先文法!z/«e ndl;return false;) else opTableopri3='<

44、:) break; /if/for (j)for for(i=0;i<sen_le n; i+)/找大于关系for(j=3;se ni j !=' 0' ; j+)if (Termi naljud(se ni j)=false&&se ni j+1 !='0'&&Termi naljud(se n ij+l)=true)(c仁sen i j ; cl记录非终结符c2=seni j+1 ;/c2 记录终结符入的列标只if(opTable0opr=c2)break;找出非终结符在last表中for(opc=0;opc<fi

45、rst_le n;opc+) 的行标j2(if(lastopc0=cl)break;for(i2=l;lastopci2!=,0, ;i2+) (c3=lastopci2;for(i3=l;i3<termj en+1;i3+) if(opTablei30=c3) (if (opTablei3opr!二'') (cout«不是算符优先文法!e ndl;return false;) else opTablei3opr='' break; /if/for (j)for opTable_le n=term_le n+1;return true;判断两算符

46、优先关系并给出类型供构造分析表int Relati on shipjud(char cl,char c2, char opTablecol, i nt opTable_le n)int i, j;for(i=l;i<opTable_le n;i+)if(opTableiO=cl) break;)for(j=l;j<opTable_le n;j+)(if(opTable0j=c2) break;)if(opTableiJj=-)return 1;else if(opTableij二二'二') return 2;else if(opTableij=二''

47、)return 3;else return 4;)判断输入串是不是优先文法bool PrioGramJud(char sen col, i nt sen_len) (int i, j;for(i=0;i<se nJ en ;i+)(for(j=4;se ni j !='0' ; j+) (if (Term in aljud(se ni j-l)=false&&Term in aljud(se ni j)二二false) (cout6输入的不是算符文法!<<e ndl; return false;)return true;开始分析输入串void

48、InputAnalyse(char opTablecol, char stringcol, int opTable_len) opTable_len 是opTable表的长度char a, Q, S SIZE = ' 0' S 是分析栈char chol, cho2;int i, j, relatio n;int k=0; Sk='#' cho2=,y:cout«zztttt 分析过程如下:”endl;cout<<zz cout«/z栈t当前字符t优先关系t移进或规约<<endl; cout<<分析过程如下

49、:<<endl;cout. width(10);cout«栈;cout. width(15);cout<< 当前字符;cout. width (20);cout« 剩余符号串;cout. width(15) ; cout<"优先关系”;cout. width(15);cout<<移进或规约"<<endl;ndl;char* p; p=stri ng;P+;for(i=0;stri ngi!='0'&&cho2二二'y' ;i+, p+)(a=stri n

50、gi;读入当前字符cho仁'n'可否接受while(chol=, n )(if(Termi nalJud(Sk)二二true)j=k;else j=k-l;规约使栈内有非终结符relati on=Relati on shipJud(Sj, a, opTable, opTable_ if (relatio n=3)" Sj >a(cout« <<S«tz/«a«,ztttt;cout. setf(ios:left);cout.width(10);cout«S;cout. un setf(ios:left

51、);cout. width (15);n);cout«a;cout. width (20); cout<<p;cout. width(15); cout<<> do (Q=Sj;if (Termi nalJud (S j-l) =:ztrue) j=j-l; else j=j_2; )while(Relatio nshipJud(Sj, Q, opTable, opTable_le n)!=1); cout<< 归约endl;cout. width (11) ; cout«Sj ; cout. width(4) ; cout<

52、<归约<endl; k=j+l; Sk"N ;for(i nt l=k+l;KSIZE;l+) Sl八0,;) else if(relati on=l) /Sj<a (chol- y ;"«a«utt vtt 移进“vve ndl; cout<< <<S«t<cout. setf(ios:left); cout. width(lO); cout<<S;cout. un setf(ios:left); cout. width(15); cout<<a;cout. width(20); cout<<p;cout. width(15); cout<

温馨提示

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

评论

0/150

提交评论