《编译原理语法分析器》由会员分享,可在线阅读,更多相关《编译原理语法分析器(37页珍藏版)》请在金锄头文库上搜索。
1、编译原理 第二次实验报告语法分析器的设计一 实验目的: 熟悉并设计一个表达式的语法分析器二 相关知识:1、形式语言基础及其文法运算2、语法分析原理及 4 种经常使用的语法分析方式其中: 四种算法为 (1)设计算术表达式的递归下降子程序分析算法 (2)设计算术表达式的 LL(1) 分析算法 (3)设计算术表达式的简单优先分析算法 (4)设计算术表达式的 SLR(1) 分析算法三实验内容:1设计表达式的语法语法分析器算法 2编写代码并上机调试运行通过要求: 输入 表达式输出 表达式语法是不是正确四 实验要求:1、给出算术表达式文法2、进行适当的文法变换3、选择一种语法分析的方式,并说明其原理4、依
2、照原理给出相应的算法设计,说明要紧的数据结构并画出算法流程 图5、编写代码并上机调试运行通过6、写出程序运行结果7、写出相应的文档和代码注释五 试探题:语法分析的任务是什么?答:语法分析是编译进程的核心部份。它的任务是在词法分析识别出单词符号串 的基础上,分析并判定程序的语法结构是不是符合语法规那么。语法分析器在编 译程序中的地位如下图。源程序单词符号语法分析树咱们明白语言的语法结构是用上下文无关文法描述的。因此,语法分析器的 要紧工作本质上确实是按文法的产生式,识别输入符号串是不是为一个句子。那 个地址所说的输入串是指由单词符号(文法的终结符)组成的有限序列。对一个 文法,当给你一串(终结)
3、符号时,如何明白它是不是该文法的一个句子呢?这 确实是要判定,看是不是能从文法的开始符号动身推导出那个输入串。或,从概 念上讲,确实是要成立一棵与输入串相匹配的语法分析树。依照语法分析树的成立方式,咱们能够粗略的把语法分析方法分成两类,一 类是自上而下的分析法,另一类是自下而上的分析法。(1)设计算术表达式的简单优先分析算法1 实验题目:算符优先语法分析器2 实验目的:熟悉并实现一个简单的扫描器3 实验内容:1设计算符优先语法分析器算法;2编写代码并上机调试运行通过。要求:输入一一表达式;输出表达式语法是不是正确。4概要设计:要采纳算符优先语法分析器分析出来的语法必需知足以下条件。第一,要判
4、定是不是是算符文法,假设产生式中含有两个接踵的非终结符那么不是算符文法 当知足这一条件后还要接着判定文法 G 是不是为算符优先文法:假设不是算符文 法或假设文法中含空字或终结符的优先级不唯一那么不是算符优先文法;当知足 以上两个条件后才能够利用算符优先语法分析器来分析那个文法。 (1)语法分析器设计1. 算术表达式文法G(E): E E 3 T | T0TT 3 F | F1 1Fi | (E)其中0表示其优先级不能进行比较,1表示优先级相等,2表示其优先级为小于,3表示其优先级为大于。void createYXB(int n)为构造优先表的函数。(2) 判定此文法是不是是符合算符优先语法分析
5、器能够进行分析的文法,依照 以上说明的两个条件写出程序段int judge1(int n)是判定是不是是算符文法:假设产生式中含有两个接踵的非终结符那么不是算符 文法void judge2(int n)是判定文法G是不是为算符优先文法:假设不是算符文法或假设文法中含空字或 终结符的优先级不唯一那么不是算符优先文法(3) void search(charLode w)将在F数组中寻觅到的终结符与非终结符对的标志位值为1(4) void FirstVT(int n)和void LastVT(int n)辅助填表(5) int judge3(char s,char a) 是用来返回在归约进程中两个非
6、终结符相较较的值 5源程序代码:#include#include#includetypedef structchar R;char r;int flag;array;typedef structchar E;char e;charLode;typedef structcharLode *base;int top;charstack;char str8080,arr8080,brr8080;array F20;int m,kk,p,ppp,FF=1;char r10;int crr2020,FLAG=0;char ccrr1120,ccrr2201;void Ini tst ack(chars
7、tack & s)/概念栈 s.base=new charLode20;s.top=-1;void push(charstack &s,charLode w) s.top+;s.bases.top.E=w.E;s.bases.top.e=w.e;void pop(charstack &s,charLode &w)w.E=s.bases.top.E;w.e=s.bases.top.e;s.top-;int IsEmpty(charstack s) if(s.top=-1)return 1;else return 0;int IsLetter(char ch)if(ch=A&ch=Z) retur
8、n 1;else return 0;/judgel是判定是不是是算符文法:假设产生式中含有两个接踵的非终结符那 么不是算符文法int judgel(int n)int j=3,flag=0;for(int i=0;i=n;i+)while(strij!=0)char a=strij;char b=strij+l;if(IsLetter(a)&IsLetter(b)flag=l;break;else j+; if(flag=l) return 0;elsereturn l;/judge2是判定文法G是不是为算符优先文法:假设不是算符文法或假设文法 中含空字或终结符的优先级不唯一那么不是算符优先文
9、法void judge2(int n)for(int i=0;i=n;i+)if(s tri3=|judge1(n)=0|FLAG=1)/ 代表空字cout“文法G不是算符优先文法!n)cout文法G是算符优先文法!endl;/searchi是查看寄存终结符的数组r中是不是含有重复的终结符 int search1(char r,int kk,char a)for(int i=0;ikk;i+)if(ri=a)break;if(i=kk) return 0;else return 1;/createF函数是用F数组寄存每一个终结符与非终结符和组合,而且值每队的 标志位为0;F数组是一个结构体vo
10、id createF(int n)int k=0,i=1;char g;char t 10;/1数组用来寄存非终结符 t0=str00;while(i=n)if(tk!=stri0) k+;tk=stri0;g=tk;i+; else i+;kk=0;char c;for(i=0;i=n;i+) int j=3;while(strij!=0)c=strij;if(IsLetter(c)=0)if(!search1(r,kk,c)rkk二c;kk+;/r数组用来寄存终结符j+;m=0;for(i=0;ik;i+)for(int j=0;jkk-1;j+)Fm.R=ti;Fm.r=rj;Fm.fl
11、ag=0;m+;/search函数是将在F数组中寻觅到的终结符与非终结符对的标志位值为1 void search(charLode w)for(int i=0;im;i+)if(Fi.R=w.E&Fi.r=w.e) Fi.flag=1;break;void FirstVT(int n)/求 FirstVTcharstack sta;charLode w;int i=0;Initstack(sta); while(i=n)int k=3;w.E=stri0;char a=strik;char b=strik+1;if(!IsLe tt er(a)/产生式的后选式的第一个字符确实是终结符的情形w.
12、e=a;push(sta,w);search(w);i+;else if(IsLetter(a)&b!=0 &!IsLetter(b)/产生式的后选式的第一 个字符是非终结符的情形w.e=b;push(sta,w);search(w);i+;else i+;charLode ww;while(!IsEmpty(sta)pop(sta,ww);for(i=0;i=n;i+)w.E=stri0;if(stri3=ww.E&stri4=0) w.e=ww.e;push(sta,w);search(w);break;p=0;int k=1;i=1;while(im)if(Fi-1.flag=1)arr
13、p0=Fi-1.R;arrpk=Fi-1.r;while(Fi.flag=0&im)i+;if(Fi.flag=1)if(Fi.R=arrp0)k+;else arrpk+1=0;p+;k=1;i+;void LastVT(int n)/求 LastVTcharstack sta;charLode w;for(int i=0;im;i+)Fi.flag=0;i=0;Initstack(sta);while(i=n)int k=strlen(stri);w.E=stri0;char a=strik-1;char b=strik-2; if(!IsLetter(a)w.e=a;push(sta,w);search(w);i+;else if(IsLetter(a)&!IsLetter(b)w.e=b;push(sta,w);search(w);i+;else i+;charLode ee;while(!IsEmpty