实验二语法分析程序的设计

上传人:第*** 文档编号:32827289 上传时间:2018-02-12 格式:DOC 页数:22 大小:228KB
返回 下载 相关 举报
实验二语法分析程序的设计_第1页
第1页 / 共22页
实验二语法分析程序的设计_第2页
第2页 / 共22页
实验二语法分析程序的设计_第3页
第3页 / 共22页
实验二语法分析程序的设计_第4页
第4页 / 共22页
实验二语法分析程序的设计_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《实验二语法分析程序的设计》由会员分享,可在线阅读,更多相关《实验二语法分析程序的设计(22页珍藏版)》请在金锄头文库上搜索。

1、一、 实验目的和要求通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单次序列进行语法检查和结构分析,进一步掌握常用语法分析方法。选择具有代表性的语法分析方法,如 LL1(k)分析方法,递归子程序法,运算符优先数法,LR(k)分析方法之一进行设计;选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式)作为分析对象,并对所选的语法分析方法要比较贴切;先写出 BNF 定义,然后编写语法分析程序,调试。(1)对输入文法,它能判断是否为 LL(1)文法,若是,则转(2) ;否则报错并终止;(2)输入已知文法,由程序自动生成它的 LL(1)分析表;(3)对于给定的输入串,应

2、能判断识别该串是否为给定文法的句型。二、 实验内容和原理A. 对表达式,项,因子的 BNF 定义B. 编写程序,自动识别是否为 LL1 文法,自动消除左递归。C. 输出 first 集,follow 集,select 集D. 输出给定句型的 LL1 分析过程三、 主要仪器设备pc 一台,vc+6.0 软件四、 操作方法与实验步骤该程序可分为如下几步:(1)读入文法 (2)判断正误 (3)若无误,判断是否为 LL(1)文法 (4)若是,构造分析表;(5)由总控算法判断输入符号串是否为该文法的句型。流程图:是 否是五、 实验结果与分析是 LL(1)文法?判断句型 报错结束有效?开始读入文法源程序:

3、#include#include#include/*/int count=0; /*分解的产生式的个数*/int number; /*所有终结符和非终结符的总数*/char start; /*开始符号*/char termin50; /*终结符号*/char non_ter50; /*非终结符号*/char v50; /*所有符号*/char left50; /*左部*/char right5050; /*右部*/char first5050,follow5050; /*各产生式右部的 FIRST 和左部的 FOLLOW 集合*/char first15050; /*所有单个符号的 FIRST

4、 集合*/char select5050; /*各单个产生式的 SELECT 集合*/char f50,F50; /*记录各符号的 FIRST 和 FOLLOW 是否已求过*/char empty20; /*记录可直接推出 的符号*/char TEMP50; /*求 FOLLOW 时存放某一符号串的 FIRST 集合*/int validity=1; /*表示输入文法是否有效*/int ll=1; /*表示输入文法是否为 LL(1)文法*/int M2020; /*分析表*/char choose; /*用户输入时使用*/char empt20; /*求_emp()时使用*/char fo20

5、; /*求 FOLLOW 集合时使用*/*判断一个字符是否在指定字符串中*/int in(char c,char *p)int i;if(strlen(p)=0)return(0);for(i=0;i+)if(pi=c)return(1); /*若在,返回 1*/if(i=strlen(p) return(0); /*若不在,返回 0*/*得到一个不是非终结符的符号*/char c()char c=A;while(in(c,non_ter)=1)c+;return(c);/*分解含有左递归的产生式*/void recur(char *point) /*完整的产生式在 point中*/int j

6、,m=0,n=3,k;char temp20,ch;ch=c(); /*得到一个非终结符*/k=strlen(non_ter);non_terk=ch;non_terk+1=0;for(j=0;j) printf(ninput error!);validity=0;return(0); /*检测输入错误*/for(k=0;k=0)firsti0=;firsti1=0;elseTEMP0=;TEMP1=0;elsefor(j=0;j+)if(vj=p0)break;if(i=0)memcpy(firsti,first1j,strlen(first1j);firstistrlen(first1j)

7、=0;elsememcpy(TEMP,first1j,strlen(first1j);TEMPstrlen(first1j)=0;else /*如果右部为符号串*/for(j=0;j+)if(vj=p0)break;if(i=0)merge(firsti,first1j,2);elsemerge(TEMP,first1j,2);for(k=0;k=0)merge(firsti,first1m,2);elsemerge(TEMP,first1m,2);else if(_emp(pk)=1&k=length-1) temp0=;temp1=0;if(i=0)merge(firsti,temp,1)

8、; elsemerge(TEMP,temp,1);else if(_emp(pk)=0)break;void FOLLOW(int i)int j,k,m,n,result=1;char c,temp20;c=non_teri; /*c 为待求的非终结符*/temp0=c;temp1=0;merge(fo,temp,1);if(c=start) /*若为开始符号*/temp0=#;temp1=0;merge(followi,temp,1);for(j=0;j=0;n-)Sp+=rightmn;Sq+strlen(rightm)=0;printf(nS:%s str:,S);for(p=j;p=0)printf(M%d%d=%d ,i,j,Mij);printf(n);menu();(1)输入一个文法(2)输入一个符号串(3)再次输入一个符号串,然后退出程序六、讨论、心得语法分析是编译过程的核心部分,其基本任务是:根据语言的语法规则分析源程序的语法结构,并在分析过程中,对源程序进行语法检查,为语义分析和代码生成做准备。由此看来。语法分析在整个编译过程的地位,所以该实验也是比较困难的,在实验过程中遇到了很多问题。虽然之前有了一定的准备,但问题不断出现,幸亏和同学之间进行交流,才把问题解决,所以实验完成后,感到了极大的兴奋和开心,这次实验收益良多。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号