河北工业大学语义分析实验报告.docx

上传人:叶*** 文档编号:35163540 上传时间:2022-08-20 格式:DOCX 页数:9 大小:14.68KB
返回 下载 相关 举报
河北工业大学语义分析实验报告.docx_第1页
第1页 / 共9页
河北工业大学语义分析实验报告.docx_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《河北工业大学语义分析实验报告.docx》由会员分享,可在线阅读,更多相关《河北工业大学语义分析实验报告.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实验三 语义分析程序实现一、实验设计在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法。基本实验题目:对文法G2中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。语法制导翻译模式是在语法分析的基础上,增加语义操作来实现的,实际上是对前后文无关文法的一种扩展。一般而言,首先需要根据进行的语义分析工作,完成对给定文法的必要拆分和语义动作的编写,从而为每一个产生式都配备相应的语义子程序,

2、以便在进行语法分析的同时进行语义解释。即在语法分析过程中,每当用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,以便完成生成中间代码、查填有关表格、检查并报告源程序中的语义错误等工作。每个语义子程序需指明相应产生式中各个符号的具体含义,并规定使用该产生式进行分析时所应采取的语义动作。这样,语法制导翻译程序在对源程序从左到右进行的一遍扫描中,既完成语法分析任务,又完成语义分析和中间代码生成方面的工作。本实验要求从编译器的整体设计出发,重点通过对实验二中语法分析程序的扩展,完成一个编译器前端程序的编写、调试和测试工作,形成一个将源程序翻译为中间代码序

3、列的编译系统。二、程序代码在词法分析和语法分析的基础上,完成了语义的分析,同样采用了头文件的形式,在VC+6.0中运行#include#include#include#include#include#includecifa.h#includefenxibiao.h# define PL 15 /+# define MI 16 /-# define MU 17# define DI 18#define acc 100#define MAXState 20#define NUMBER 9/表达式的个数#define MAXTEMP 10/最多临时变量的个数int StateMAXState;/状态

4、栈int i=0;int CURRENTSTATE=0;/标识当前状态int LENGTHNUMBER=1,3,3,1,3,3,1,3,1;/表达式右边的长度int length;int index;/索引int Yes=0;/判断是否结束int tag=0;/判断是否需要调用词法程序/extern char * cifa();double e1,t4,f7;/整形char e1220,t4220,f7220;/字符型int TEMPMAXTEMP;int temp=0;int biaoshifu=0;FILE * fp;void REPORT_ERROR()Yes=1;long f1=fte

5、ll(fp);char ch=fgetc(fp);fseek(fp,-1,1);printf(语法错误,第%d个字符%C处n,f1,ch);void Accept()Yes=1;/printf(语法分析成功n);int INDEX(char a)/获取当前字符串对应的索引int i;switch (a)case E:i=8;return(i);break;case T:i=9;return(i);break;case F:i=10;return(i);break;default: REPORT_ERROR();return(0); break;void Gen(int a,double i1,

6、double i2,int t)/输出四元式switch(a)case PL:printf(+,%g,%g,%d)n,i1,i2,t);break;case MI:printf(-,%g,%g,%d)n,i1,i2,t);break;case MU:printf(*,%g,%g,%d)n,i1,i2,t);break;case DI:printf(/,%g,%g,%d)n,i1,i2,t);break;default:break;void yuyi(int n)/语义子程序switch(n)case 1: temp+;/产生临时变量,Gen(PL,e1,t4,temp);e1=temp;bre

7、ak;case 2:temp+;/产生临时变量,TEMPtempGen(MI,e1,t4,temp);e1=temp;break;case 3:e1=t4;break;case 4:temp+;Gen(MU,t4,f7,temp);t4=temp;break;case 5:temp+;Gen(DI,t4,f7,temp);t4=temp;break;case 6:t4=f7;break;case 7:f7=e1;break;case 8:f7=FCON;break;default :printf(errorn);break;void Gen2(int a,char *i1,char *i2,i

8、nt t)/输出四元式switch(a)case PL:printf(+,%s,%s,%d)n,&i1,&i2,t);break;case MI:printf(-,%s,%s,%d)n,&i1,&i2,t);break;case MU:printf(*,%s,%s,%d)n,&i1,&i2,t);break;case DI:printf(/,%s,%s,%d)n,&i1,&i2,t);break;default:break;void fuzhi(char *a,char *b)/将数组b赋值给数组avoid yuyi2(int n)/语义子程序switch(n)case 1: temp+;/产

9、生临时变量Gen2(PL,e12,t42,temp);e120=temp;break;case 2:temp+;/产生临时变量,TEMPtempGen2(MI,e12,t42,temp);e120=temp;break;case 3:/e12=t42;strcpy(e12,t42);break;case 4:temp+;Gen2(MU,t42,f72,temp);t420=temp;break;case 5:temp+;Gen2(DI,t42,f72,temp);t420=temp;break;case 6:/t42=f72;strcpy(t42,f72);break;case 7:/f72=

10、e12;strcpy(f72,e12);break;case 8:/f72=TOKEN0;strcpy(f72,TOKEN);break;default :printf(errorn);break;void INPUT(int a)index=a;int index2=0;if(TableCURRENTSTATEindex!=acc)if (TableCURRENTSTATEindex=0)/报错REPORT_ERROR();else if (TableCURRENTSTATEindex20)/移近 i+; Statei=TableCURRENTSTATEindex; CURRENTSTATE

11、=Statei; else /规约tag=1;length=LENGTHTableCURRENTSTATEindex-20; i=i-length;/指针回退 switch(TableCURRENTSTATEindex-20)case 1: case 2:case 3:index2=8;break;case 4:case 5:case 6:index2=9;break;case 7:case 8:index2=10;break;default :REPORT_ERROR();break;if (biaoshifu!=1)/不是标识符yuyi(TableCURRENTSTATEindex-20)

12、;/规约调用语义子程序elseyuyi2(TableCURRENTSTATEindex-20);/规约调用语义子程序CURRENTSTATE=Statei;i+; Statei=TableCURRENTSTATEindex2;CURRENTSTATE=Statei;else Accept();CURRENTSTATE=0;void main() int res; State0=0; if(fp=fopen(b.txt,r)=NULL) printf(file open error!n); exit(0); else res=cifa(fp); if(start=1)/文件以begin开始 do

13、 res=cifa(fp);if(end=0) fseek(fp,-1,1);/文件指针回退一个*/ do if(tag=0) res=cifa(fp); tag=0; if (res=26)biaoshifu=1;res=res-20; INPUT(res); while(Yes!=1);/一个语法句子翻译完成 Yes=0;/归零 i=0; cifa(fp);if(ch=EOF)end=1;printf(没有end结束符n); fseek(fp,-1,1);while(end=0); cifa(fp); if(ch!=EOF) printf(end结束标识符后程序没有结束!n); /文件结束 else printf(缺少程序开始符!n);三、实验结果Begin标志着文件的开始,End标志着文件的结束

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

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁