没有合适的资源?快使用搜索试试~ 我知道了~
首页实验二 语法分析器 编译原理
实验二 语法分析器 编译原理
需积分: 9 12 下载量 61 浏览量
更新于2023-03-16
评论
收藏 217KB DOC 举报
是编译原理语法分析器的实验报告,对文法是否是LL1的判定以及对(i+i)*i和i+i)*i的判断
资源详情
资源评论
资源推荐
华北水利水电学院 验二 语法分析程序 实验报告
2010~2011学年 第 二 学期 2008 级 计算机 专业
班级: 2008109 学号: 200810804 姓名: 王鹏飞
一、目的与要求
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单
词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
二、实验要求
⑴ 选择最有代表性的语法分析方法,如LL(1)分析法、算符优先法或LR分析法
⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对
象,并且与所选语法分析方法要比较贴切。
⑶ 实习时间为6小时。
三、实验内容
选题1:使用预测分析法(LL(1)分析法)实现语法分析:
(1)根据给定文法,先求出first集合、follow集合和select集合,构造预测分析表(要求
预测分析表输出到屏幕或者输出到文件);
(2)根据算法和预测分析表分析给定表达式是否是该文法识别的正确的算术表达式(要
求输出归约过程)
(3)给定表达式文法为:
G(E): S→TE
E→+TE |
T→FK
K→*FK |
F→(S)|i
(4)分析的句子为:
(i+i)*i和i+i)*i
选题2:使用算符优先分析法实现语法分析:
(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关
系表输出到屏幕或者输出到文件);
(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要
求输出归约过程)
(3)给定表达式文法为:
G(E’): E’→#E#
E→E+T | T
T→T*F |F
F→(E)|i
(4)分析的句子为:
(i+i)*i和i+i)*i
四、程序源代码
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
/*******************************************/
int count=0; //产¨²生¦¨²式º?的Ì?个?数ºy
int number; //所¨´有®D终?结¨¢符¤?和¨ª非¤?终?结¨¢符¤?的Ì?总Á¨¹
数ºy
char start; //开a始º?符¤?号?
char termin[50]; //终?结¨¢符¤?号?
char non_ter[50]; //非¤?终?结¨¢符¤?号?
char v[50]; //所¨´有®D符¤?号?
char left[50]; //左Á¨®部?
char right[50][50]; //右®¨°部?
char first[50][50],follow[50][50]; //各¡Â产¨²生¦¨²式º?右®¨°部?的Ì?
FIRST和¨ª左Á¨®部?的Ì?FOLLOW集¡¥合?
char first1[50][50]; //所¨´有®D单Ì£¤个?符¤?号?的Ì?FIRST集¡¥合?
char select[50][50]; //各¡Â个?产¨²生¦¨²式º?的Ì?SELECT集¡¥合?
char firstflag[50],followflag[50]; //记?录?各¡Â符¤?号?的Ì?FIRST和
¨ªFOLLOW是º?否¤?已°?求¨®过y
char empty[20]; //记?录?可¨¦推ª?出?&的Ì?符¤?号?
char nonempty[20]; //记?录?不?可¨¦推ª?出?&的Ì?符¤?号?
char empt[20]; //求¨®_emp()时º¡À使º1用®?
char TEMP[50]; //求¨®FOLLOW时º¡À存ä?放¤?某3一°?符¤?号?串ä?的Ì?
FIRST集¡¥合?
int validity=1; //表À¨ª示º?输º?入¨?文?法¤¡§是º?否¤?有®D效¡ì
int ll=1; //表À¨ª示º?输º?入¨?文?法¤¡§是º?否¤?为aLL(1)文?法¤
¡§
int M[20][20]; //分¤?析?表À¨ª
char choose; //用®?户¡ì输º?入¨?时º¡À使º1用®?
char foll[20]; //求¨®FOLLOW集¡¥合?时º¡À使º1用®?
/*******************************************
判D断?一°?个?字Á?符¤?c是º?否¤?在¨²指?定¡§字Á?符¤?串ä?p中D
********************************************/
int in(char c,char *p)
{
int i;
if(strlen(p)==0)
return(0);
for(i=0;;i++)
{
if(p[i]==c)
return(1); //若¨?在¨²,ê?返¤¦Ì回?1
if(i==(int)strlen(p))
return(0); //若¨?不?在¨²,ê?返¤¦Ì回?0
}
}
/*******************************************
将?单Ì£¤个?符¤?号?或¨°符¤?号?串ä?并¡é入¨?另¢¨ª一°?符¤?号?串ä?
********************************************/
void merge(char *d,char *s,int type)
{ //是º?目?标À¨º符¤?号?串ä?,ê?s是º?源¡ä串ä?,ê?type=ê?1,ê?
源¡ä串ä?中D的Ì?'&'一°?并¡é并¡é入¨?目?串ä?;ê?
//type=ê?2,ê?源¡ä串ä?中D的Ì?'&'不?并¡é入¨?目?串ä?
int i,j;
for(i=0;i<=(int)strlen(s)-1;i++)
{
if(type==2&&s[i]=='&');
else
{
for(j=0;;j++)
{
if(j<(int)strlen(d)&&s[i]==d[j])
break; //若¨?已°?存ä?在¨²,ê?则¨°退ª?出?,ê?继¨¬续?看¡ä
下?一°?个?源¡ä串ä?字Á?符¤?
if(j==(int)strlen(d)) //若¨?不?存ä?在¨²,ê?则¨°并¡é入¨?
{
d[j]=s[i];
d[j+1]='\0';
break;
}
}
}
}
}
/*******************************************
读¨¢入¨?一°?个?文?法¤¡§
********************************************/
char grammer(char *t,char *n,char *left,char right[50][50])
{
char vn[50],vt[50];
char s;
char p[50][50];
int i,j;
printf("请?输º?入¨?文?法¤¡§的Ì?非¤?终?结¨¢符¤?号?串ä?:êo");
scanf("%s",vn);
getchar();
i=strlen(vn);
memcpy(n,vn,i);
n[i]='\0';
printf("请?输º?入¨?文?法¤¡§的Ì?终?结¨¢符¤?号?串ä?:êo");
scanf("%s",vt);
getchar();
i=strlen(vt);
memcpy(t,vt,i);
t[i]='\0';
printf("请?输º?入¨?文?法¤¡§的Ì?开a始º?符¤?号?:êo");
scanf("%c",&s);
getchar();
printf("请?输º?入¨?文?法¤¡§产¨²生¦¨²式º?的Ì?条¬?数ºy:êo");
scanf("%d",&i);
getchar();
count=i;
for(j=1;j<=i;j++)
{
printf("请?输º?入¨?文?法¤¡§的Ì?第̨²%d条¬?(ꡧ共2%d条¬?)ê?产¨²生¦¨²
式º?:êo",j,i);
scanf("%s",p[j-1]);
getchar();
}
for(j=0;j<=i-1;j++)
{
if(p[j][1]!='-'||p[j][2]!='>') //检¨¬测a输º?入¨?错䨪误¨®
{
printf("\n输º?入¨?错䨪误¨®!");
validity=0;
return('\0');
}
}
return(s);
}
/*******************************************
判D断?读¨¢入¨?的Ì?文?法¤¡§是º?否¤?正y确¨¡¤
********************************************/
int judge()
{
int i,j;
for(i=0;i<=count-1;i++)
{
if(in(left[i],non_ter)==0)
{ //若¨?左Á¨®部?不?在¨²非¤?终?结¨¢符¤?中D,ê?报À¡§
错䨪
printf("\n文?法¤¡§左Á¨®部?出?错䨪!");
validity=0;
return(0);
}
for(j=0;j<=(int)strlen(right[i])-1;j++)
{
if(in(right[i][j],non_ter)==0&&in(right[i]
[j],termin)==0&&right[i][j]!='&')
{ //若¨?右®¨°部?某3一°?符¤?号?不?在¨²非¤?终?结¨¢符¤?、
¡é终?结¨¢符¤?中D且¨°不?为a'&',ê?报À¡§错䨪
printf("\n文?法¤¡§右®¨°部?出?错䨪!");
validity=0;
return(0);
}
}
}
return(1);
}
/*******************************************
求¨®所¨´有®D能¨¹直¡À接¨®推ª?出?&的Ì?符¤?号?
********************************************/
void emp(char c)
{
char temp[10];
int i;
for(i=0;i<=count-1;i++)
{
if(right[i][0]==c&&strlen(right[i])==1)
{
temp[0]=left[i];
temp[1]='\0';
merge(empty,temp,1);//求¨®所¨´有®D能¨¹直¡À接¨®推ª?出?'&"的Ì?符¤?
号?,结¨¢果?保À¡ê存ä?到Ì?empty[]中D
emp(left[i]);
}
}
}
剩余20页未读,继续阅读
abcd661224
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0