下载 >  开发技术 >  C > 编译原理实验报告和源程序

编译原理实验报告和源程序

2009-05-26 上传大小:671KB
分享
附录c 编译程序实验
实验目的:用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。
语法分析
C2.1 实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析.
C2.2 实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析.
C2.2.1待分析的简单语言的语法
实验目的
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法.
实验要求
采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。

实验的输入和输出
输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。
例如:对于语句串
begin   a:=2+3*4;x:=(a+b)/c end#
输出的三地址指令如下:
(1)	t1=3*4
(2)	t2=2+t1
(3)	a=t2
(4)	t3=a+b
(5)	t4=t3/c
(6)	x=t4
算法思想
1设置语义过程
(1)	emit(char *result,char *arg1,char *op,char *ag2)
该函数功能是生成一个三地址语
                            句送到四元式表中。
四元式表的结构如下:
struct {char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
(2)char *newtemp()
该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,….
Char *newtemp(void)
{
    char *p;
    char m[8];
    p=(char *)malloc(8);
    k++;
    itoa(k,m,10);
    strcpy(p+1,m);
    p[0]=’t’;
    return(p);
}
(2)主程序示意图如图c.10所示。


 
(2)	函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。
语义分析程序的C语言程序框架

int lrparser()
{    int schain=0;
kk=0;
if(syn=1)
{  读下一个单词符号;
   schain=yucu;  /调用语句串分析函数进行分析/
   if(syn=6)
  {   读下一个单词符号;
      if(syn=0 && (kk==0))
      输出(“success”);
  }
else { if(kk!=1 )  输出 ‘缺end’ 错误;kk=1;}
else{输出’begin’错误;kk=1;}
}
return(schain);


int yucu()
{    int schain=0;
schain=statement();/调用语句分析函数进行分析/
while(syn=26)
{读下一个单词符号;
schain=statement();  /调用语句分析函数进行分析/
}
return(schain);
}


int statement()
{   char tt[8],eplace[8];
int schain=0;
{switch(syn) 
  {case 10:
         strcpy(tt,token);
         scanner();
         if(syn=18)
         {读下一个单词符号;
          strcpy(eplace,expression());
          emit(tt,eplace,””,””);
           schain=0;
          }
          else {输出’缺少赋值号’的错误;kk=1;
}
return(schain);
break;

}
}

char *expression(void)
{char *tp,*ep2,*eplace,*tt;
 tp=(char *)malloc(12);/分配空间/
 ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt =(char )malloc(12);
strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/

while(syn=13 or 14)
{  操作符 tt= ‘+’或者‘—’;
读下一个单词符号;
strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/
strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/
emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/
strcpy(eplace,tp);
}
return(eplace);
}

char *term(void)/仿照函数expression编写/
char *factor(void)
{char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace, “  ”);
if(syn=10)
{strcpy(fplace,,token);/将标识符token的值赋给fplace/
读下一个单词符号;
}
else if(syn=11)
    {itoa(sum,fplace,10);
     读下一个单词符号;
}
else if (syn=27)
{读下一个单词符号;
fplace=expression();/调用expression分析返回表达式的值/
if(syn=28)
读下一个单词符号;
else{输出‘}’错误;kk=1;
}
}
else{输出‘(’错误;kk=1;
}
return(fplace);
}                        
...展开收缩
综合评分:4
开通VIP 立即下载

评论共有2条

aaronli713 2012-05-29 21:56:02
最好把三个实验程序分开成不同的文件,便于理解
carlyzhou1991 2012-05-29 15:07:31
有三个实验的集合,但是在Dev里无法正常运行,需要修改!
 
编译原理词法分析,语法分析,语义分析(源代码和实验报告) 立即下载
积分/C币:3
编译原理语义分析和中间代码生成实验报告 立即下载
积分/C币:3
编译原理实验报告 词法分析器实验报告 立即下载
积分/C币:3
编译原理(词法、语法、语义分析实验报告+源代码) 立即下载
积分/C币:3
编译技术实验3--LR语法分析 立即下载
积分/C币:3
编译原理中间代码生成实验报告——完整版 立即下载
积分/C币:8
编译原理 语义分析及中间代码生成 c语言 立即下载
积分/C币:5
编译原理实验一、实验二、实验三、实验四、实验五实验报告完整打包 立即下载
积分/C币:5
上海大学 编译原理实验报告 立即下载
积分/C币:3
编译原理语法分析器实验报告.doc版下载 立即下载
积分/C币:5

热点文章

VIP会员动态

推荐下载

关闭
img

spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip

资源所需积分/C币 当前拥有积分 当前拥有C币
5 0 0
点击完成任务获取下载码
输入下载码
为了良好体验,不建议使用迅雷下载
img

编译原理实验报告和源程序

会员到期时间: 剩余下载个数: 剩余C币: 剩余积分:0
为了良好体验,不建议使用迅雷下载
VIP下载
您今日下载次数已达上限(为了良好下载体验及使用,每位用户24小时之内最多可下载20个资源)

积分不足!

资源所需积分/C币 当前拥有积分
您可以选择
开通VIP
4000万
程序员的必选
600万
绿色安全资源
现在开通
立省522元
或者
购买C币兑换积分 C币抽奖
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 4 45
为了良好体验,不建议使用迅雷下载
确认下载
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 0 0
为了良好体验,不建议使用迅雷下载
开通VIP
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 4 45
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
确认下载
下载
无法举报自己的资源

兑换成功

你当前的下载分为234开始下载资源
你还不是VIP会员
开通VIP会员权限,免积分下载
立即开通

你下载资源过于频繁,请输入验证码

您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:webmaster@csdn.net!

举报

若举报审核通过,可返还被扣除的积分

  • 举报人:
  • 被举报人:
  • *类型:
    • *投诉人姓名:
    • *投诉人联系方式:
    • *版权证明:
  • *详细原因: