实验二 自上而下的语法分析

实验二 自上而下的语法分析

ID:38698548

大小:596.00 KB

页数:21页

时间:2019-06-17

实验二 自上而下的语法分析_第1页
实验二 自上而下的语法分析_第2页
实验二 自上而下的语法分析_第3页
实验二 自上而下的语法分析_第4页
实验二 自上而下的语法分析_第5页
资源描述:

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

1、上海电力学院编译原理实验报告实验题目:自上而下的语法分析院  系:计算机科学与技术学院专业年级:20年 月  日实验二自上而下的语法分析一、实验目的:通过本实验理解语法分析的作用,分析对象、分析的方式和处理的结果,是重点内容。二、实验学时:4学时。三、实验内容根据给出的简单语言的语法构成规则(见五),编制语法分析程序,要求能将词法分析输出的单词文件用给定的语法规则书写的源程序进行语法分析,输出相应的语法分析结果和错误信息。关于错误信息:不要求错误种类,只需给出出错位置(当前的输入符号)。四、实验

2、方法递归下降法及LL(1)分析法。首先需手工将文法改写成LL(1)文法。选用递归下降法时需手工求出各个候选的首符集和非终结符号的FOLLOW集;选用LL(1)分析法时需手工求出预测分析表。对于整数和标识符的识别可以借助实验1。五、文法定义简单的表达式文法如下:E->E+T

3、E-T

4、TT->T*F

5、T/F

6、FF->(E)

7、i上式中,i为整数或标识符六、程序源代码#include#include#include/***************

8、****************************/intcount=0;/*分解的产生式的个数*/intnumber;/*所有终结符和非终结符的总数*/charstart;/*开始符号*/chartermin[50];/*终结符号*/charnon_ter[50];/*非终结符号*/charv[50];/*所有符号*/charleft[50];/*左部*/charright[50][50];/*右部*/charfirst[50][50],follow[50][50];/*各产生式右部的F

9、IRST和左部的FOLLOW集合*/charfirst1[50][50];/*所有单个符号的FIRST集合*/charselect[50][50];/*各单个产生式的SELECT集合*/charf[50],F[50];/*记录各符号的FIRST和FOLLOW是否已求过*/charempty[20];/*记录可直接推出^的符号*/charTEMP[50];/*求FOLLOW时存放某一符号串的FIRST集合*/intvalidity=1;/*表示输入文法是否有效*/intll=1;/*表示输入文法是

10、否为LL(1)文法*/intM[20][20];/*分析表*/charchoose;/*用户输入时使用*/charempt[20];/*求_emp()时使用*/charfo[20];/*求FOLLOW集合时使用*/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*/}}charc(){

11、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=strlen(non_ter);non_ter[k]=ch;non_ter[k+1]='';for(j=0;j<=strlen(point)-1;j++){if(point[n]==point[0]){/*如果‘

12、

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

14、'&&point[j]!='')temp[m++]=point[j++];left[count]=ch;memcpy(right[count],temp,m);right[count][m]=ch;right[count][m+1]='';m=0;count++;if(point[j]=='

15、'){n=j+1;break;}}}else{/*如果‘

16、’后的首符

17、号和左部不同*/left[count]=ch;right[count][0]='^';right[count][1]='';count++;for(j=n;j<=strlen(point)-1;j++){if(point[j]!='

18、')temp[m++]=point[j];else{left[count]=point[0];memcpy(right[count],temp,m);right[count][m]=ch;right[count][m+1]='';printf("count=

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

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

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