LL1语法分析报告报告材料程序实验报告材料_第1页
LL1语法分析报告报告材料程序实验报告材料_第2页
LL1语法分析报告报告材料程序实验报告材料_第3页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、LL1实验报告08计算机3班1. 设计原理所谓LL (1 )分析法,就是指从左到右扫描输入串(源程序) ,同时采用最左推导,且 对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现LL( 1)分析的程序又称为 LL ( 1 )分析程序或LL1 ( 1 )分析器。我们知道一个文法要能进行LL( 1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL( 1)分析表,最后利用分析表,根据LL(1) 语法分析构造一个分析器。 LL( 1 )的语法分析程序

2、包含了三个部分,总控程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了 C+语言来编写,其逻辑结构图如下:LL( 1 )预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。对于任何(X,a),总控程序每次都执行下述三种可能的动作之一:(1)若X = a = # ',则宣布分析成功,停止分析过程。(2)若X = a # ',则把X从STACK栈顶弹出,让a指向下一个输入符号。(3)若X是一个非终结符,则查看预测分析表M。若MA , a中存放着关于X的一个产生式,那么,首先把 X弹出STACK栈顶

3、,然后,把产生式的右部符号串按反序一一弹出STACK栈(若右部符号为 则不推什么东西进STACK栈)。若MA , a中存放着“出错标志”,则调用出错诊断程序ERROR。事实上,LL ( 1)的分析是根据文法构造的,它反映了相应文法所定义的语言的固定特征,因此在LL( 1 )分析器中,实际上是以 LL( 1 )分析表代替相应方法来进行分析的。2. 分析LL ( 1)分析表是一个二维表,它的表列符号是当前符号,包括文法所有的终结和自定义。的句子结束符号#,它的表行符号是可能在文法符号栈 SYN中出现的所有符号, 包括所有的非终结符,所有出现在产生式右侧且不在首位置的终结符,自定义的句子结束符号#表

4、项。为当前栈符号与当前符号匹配后,所要求的栈操作和输入操作。表项表明了文法 的终结符与非终结符是否可能相遇。其中 ,栈操作包括两种,一是弹栈;二是 弹栈后,将符号串ABc反转后压栈;输入操作包括两种,一是读入下 一符号,是保持当前符号不变。具体的造算法为171 o(1 )设A , B为文法的非终结符,C为文法的终结符和非终结符组成的字符串,a为文法的终结符将所 有产生式分为四类:6)A->aB,则(A,a )项填写为(B调 向后压栈,读入下一个字符):(ii)A->a; A->a,则将A, a)项填写为(弹栈,读入下 一个字符):(iii)A->BC,则将(A,sele

5、ct(A->BC)项全部填写为(将BC调向后压栈, 保持当前字符不读入):(iv)A->N,则将(A, follow(A)项全部填写为(弹栈,保持当前字符不读)(2)对表行和表列的所有字符进行循环; 如果当前表行的字符是非终结符,它必有产生式,依据此产生式的类型,填 写表项。(4)如果当前表列的字符不在此产生式的选择集合中,该项填写为Eror。对(# , #)项填写为0K ;(6)对当前表行字符为终结符的,只有它与表列字符相同时,才填写为(弹栈,读 入下一个字符),否则填入Eror。3流程图数据结构#in clude"iostream.h"#i nclude &

6、quot;stdio.h"#i nclude "malloc.h"#i nclude "con io.h"struct Lcharchar char_ch;struct Lchar *n ext;Lchar,*p,*h,*temp,*top,*base;char curchar;char curtocmp;int right;int table58=1,0,0,1,0,0,0,1,0,0,1,1,1,0,0,1,0,0,0,1,1,0,1,1,1,0,0,1,0,0;int i,j;void push(char pchar)temp=(stru

7、ct Lchar*)malloc(sizeof(Lchar); temp->char_ch=pchar;temp->n ext=top;top=temp;void pop(void)curtocmp=top->char_ch;if(top->char_ch!='#')top=top->n ext;void doforpush(i nt t)switch(t)case O:push('A');push('T');break;case 5:push('A');push('T');break

8、;case 11:push('A');push('T');push('+');break;case 20:push('B');push('F');break;case 23:push('B');push('F');break;case 32:push('B');push('F');push('*');break;case 40:push('i');break;case 43:push(')');push(

9、'E');push('(');void cha ngcharto in t()switch(curtocmp)case 'A':i=1;break;case 'B':i=3;break;case 'E':i=0;break;case T:i=2;break;case 'F':i=4;switch(curchar)case 'i':j=0;break;case '+':j=1;break;case '*':j=2;break;case '(

10、9;:j=3;break;case ')':j=4;break;case '#':j=5;void dosome(void)int t;for(;)pop();curchar=h->char_ch;prin tf("n%ct%c",curchar,curtocmp);if(curtocmp='#' && curchar='#')break;if(curtocmp='A'|curtocmp='B'|curtocmp='E'|curtocmp=&

11、#39;T'|curtocmp='F')if(curtocmp!='#')cha ngcharto in t();if(tablei j)t=1O*i+j;doforpush(t);con ti nue;elseright=0;break;elseif(curtocmp!=curchar)right=0;break;elsebreak;elseif(curtocmp!=curchar)right=0;break;elseh=h->n ext;con ti nue;void mai n(void)char ch;cout<<"*

12、文件名称:语法分析"<<endl;cout<<""<<e ndl;cout<<"/*程序相关说明*/"<<e ndl;cout<<""<<e ndl;cout<<"-/* A=E ' B=T ' */"<<endl;cout<<"-* 目 的:对输入LL(1)文法字符串,本程序能自动判断所给字符串是-"<<e ndl;cout<<

13、;"-*否为所给文法的句子,并能给出分析过程。-"<<e ndl;cout<<"-*"<<e ndl;cout<<" 表达式文法为:"<<e ndl;cout<<"E->E+T|T"<<e ndl;cout<<"T->T*F|F"<<e ndl;cout<<"F->(E)|i"<<e ndl;cout<<"

14、请在下行输入要分析的串(#号结束):"<<endl;right=1;base=(struct Lchar*)malloc(sizeof(Lchar); base->n ext=NULL;base->char_ch='#'temp=(struct Lchar*)malloc(sizeof(Lchar); temp->n ext=base;temp->char_ch='E:top=temp;h=(struct Lchar*)malloc(sizeof(Lchar);h-> next=NULL;p=h;do ch=getch

15、();putch(ch);if(ch='i'|ch='+'|ch='-'|ch='*'|ch=7'|ch='('|ch=')'|ch='#')temp=(struct Lchar*)malloc(sizeof(Lchar);temp->n ext=NULL;temp->char_ch=ch;h->n ext=temp;h=h->n ext;elsetemp=p->n ext;prin tf("nln put a wrong char!l

16、 nput aga in:n");for(;)if (temp!=NULL)prin tf("%c",temp->char_ch);elsebreak;temp=temp->n ext;while(ch!='#');p=p->n ext;h=p;dosome();if(right)printf("n成功!n");elseprin tf("n 错误!n");getch();截图:预测分析程序&一、预测分析器的结构预测分析表是一个 MA ,a形式的矩阵。其中,A为非终结符,a是终结符或#

17、'(注 意,#'不是文法的终结符,我们总把它当成输入串的结束符。虽然它不是文法的一部分,但假定它的存在将有助于简化分析算法的描述)。矩阵元素MA , a中存放着一条关于 A的产生式,指出当 A面临输入符号a时所应采用的候选。 MA , a中也可能存放一个“出 错标志”,指出 A根本不该面临输入符号 a。栈STACK氏I用于存放文法符号。分析开始时,栈底先放一个#',然后,放进文法 开始符号。同时,假定输入串之后也总有一个#',标志输入串结束。预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号 a行事的。对于任何(X,a),总控程序每次都执

18、行下述三种可能的动作之一:(1 )若X = a ='#',则宣布分析成功,停止分析过程。(2) 若X = a 1 #',则把X从STACK栈顶逐出,让a指向下一个输入符号。(3) 若X是一个非终结符,则查看分析表M。若MA , a中存放着关于X的一个产 生式,那么,首先把 X逐出STACK栈顶,然后,把产生式的右部符号串按反序一一推进 STACK栈(若右部符号为 e,则意味不推什么东西进栈)。在把产生式的右部符号推进栈的同时应做这个产生式相应的语义动作(目前暂且不管)。若MA , a中存放着“出错标志”,则调用出错诊察程序ERROR。预测分析器的结构如图所示栈输出(采选

19、用的产生式图1预测分析器的结构、预测分析控制程序预测分析控制程序依用的描述:置ip指向3 #的第一个符号repeat令X是栈顶符号,a是ip所指向的符号if X是一个终结符号或# thenif X= a the n把X从栈中弹出,并且更新ipelse error ()else /*X是非终结符号*/if MX,a =X Y1Y2. . Yk then begin把X从栈中弹出;把Yk,Yk-1,. .,Y1压入栈中,即Y1在顶上;输出产生式 X Y1Y2. . Ykendelse error()until X=# /* 栈为空 */表1字符串i + i * i的分析过程符号栈输入串所用产生式#E#E'T#E ' T'F#E ' T'i#E ' T'#E '#E ' T+#E 'T#E ' T'F#E ' T' id#E ' T' F*#E ' T'F#E ' T'i#E '

温馨提示

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

评论

0/150

提交评论