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

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

ID:38698906

大小:228.00 KB

页数:22页

时间:2019-06-17

实验二语法分析程序的设计_第1页
实验二语法分析程序的设计_第2页
实验二语法分析程序的设计_第3页
实验二语法分析程序的设计_第4页
实验二语法分析程序的设计_第5页
资源描述:

《实验二语法分析程序的设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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

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

3、:开始读入文法有效?是否是LL(1)文法?结束报错判断句型是二、实验结果与分析源程序:#include#include#include/*******************************************/intcount=0;/*分解的产生式的个数*/intnumber;/*所有终结符和非终结符的总数*/charstart;/*开始符号*/chartermin[50];/*终结符号*/charnon_ter[50];/*非终结符号*/char

4、v[50];/*所有符号*/charleft[50];/*左部*/charright[50][50];/*右部*/charfirst[50][50],follow[50][50];/*各产生式右部的FIRST和左部的FOLLOW集合*/charfirst1[50][50];/*所有单个符号的FIRST集合*/charselect[50][50];/*各单个产生式的SELECT集合*/charf[50],F[50];/*记录各符号的FIRST和FOLLOW是否已求过*/charempty[20];/*记录可直接推出^的符

5、号*/charTEMP[50];/*求FOLLOW时存放某一符号串的FIRST集合*/intvalidity=1;/*表示输入文法是否有效*/intll=1;/*表示输入文法是否为LL(1)文法*/intM[20][20];/*分析表*/charchoose;/*用户输入时使用*/charempt[20];/*求_emp()时使用*/charfo[20];/*求FOLLOW集合时使用*//*******************************************判断一个字符是否在指定字符串中********

6、************************************/intin(charc,char*p){inti;if(strlen(p)==0)return(0);for(i=0;;i++){if(p[i]==c)return(1);/*若在,返回1*/if(i==strlen(p))return(0);/*若不在,返回0*/}}/*******************************************得到一个不是非终结符的符号*********************************

7、***********/charc(){charc='A';while(in(c,non_ter)==1)c++;return(c);}/*******************************************分解含有左递归的产生式********************************************/voidrecur(char*point){/*完整的产生式在point[]中*/intj,m=0,n=3,k;chartemp[20],ch;ch=c();/*得到一个非终结符*/k=s

8、trlen(non_ter);non_ter[k]=ch;non_ter[k+1]='';for(j=0;j<=strlen(point)-1;j++){if(point[n]==point[0]){/*如果‘

9、’后的首符号和左部相同*/for(j=n+1;j<=strlen(point)-1;j++){while(point

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。