![编译原理四则表达式试验_第1页](http://file4.renrendoc.com/view/45cb38fb555e6c2db1531a809550238f/45cb38fb555e6c2db1531a809550238f1.gif)
![编译原理四则表达式试验_第2页](http://file4.renrendoc.com/view/45cb38fb555e6c2db1531a809550238f/45cb38fb555e6c2db1531a809550238f2.gif)
![编译原理四则表达式试验_第3页](http://file4.renrendoc.com/view/45cb38fb555e6c2db1531a809550238f/45cb38fb555e6c2db1531a809550238f3.gif)
![编译原理四则表达式试验_第4页](http://file4.renrendoc.com/view/45cb38fb555e6c2db1531a809550238f/45cb38fb555e6c2db1531a809550238f4.gif)
![编译原理四则表达式试验_第5页](http://file4.renrendoc.com/view/45cb38fb555e6c2db1531a809550238f/45cb38fb555e6c2db1531a809550238f5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——编译原理四则表达式试验1、前序
这是编译原理的试验,自认为是上大学以来做过的最难的一个试验。所以写篇博客记录一下。
试验用到的基础知识:C语言、数据结构、汇编(只需简单的了解)。开发工具:VC
2、问题描述
编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码。消除左递归后的文法:E→TE'E'→+TE'|εT→FT'T'→*FT'|ε
F→(E)|i
消除左递归后的翻译模式:E::=T{E'.i:=T.nptr}E'{E.nptr:=E'.s}
E'::=+T{E'1.i:=mknode(‘+’,E'.i,T.nptr)}E'1{E'.s:=E1.s}
E'::=-T{E'1.i:=mknode(‘-’,E'.i,T.nptr)}E'1{E'.s:=E1.s}
E'::=ε{E'.s:=E'.i}T::=F{T'.i:=F.nptr}T'{T.nptr:=T'.s}
T'::=*F{T'1.i:=mknode(‘*’,T'.i,F.nptr)}T'1{T'.s:=T1.s}
T'::=/F{T'1.i:=mknode(‘/’,T'.i,F.nptr)}T'1{T'.s:=T1.s}T'::=ε{T'.s:=T'.i}F::=(E){F.nptr:=E.nptr}
F::=num{F.nptr:=mkleaf(num,num.val)}
3、全局定义
test.c文件
#ifndefTEST_C#defineTEST_C/**
*全局变量和全局函数文件**/
#include#include#include#include
/*************************以下是全局变量(函数)的定义*******************/
//输入的表达式最大长度,可以看做是缓冲区的长度#defineMAX_EXPRESSION_LENGTH50
//存放输入的表达式
charexpression[MAX_EXPRESSION_LENGTH];
//表达式字符数组的下标intexpression_index=0;
//存放一个单词符号
charstrToken[MAX_EXPRESSION_LENGTH/2];
//判断是否是数字
intisNum(char*strToken){
inti=0;
while(strToken[i]){}
returnstrToken[i]==0;
2
if(!isdigit(strToken[i]))i++;
break;
}
//错误处理程序
voiderror(char*errerMessage){
printf(\exit(0);
}
/*************************以上是全局变量(函数)的定义******************/#endif
4、词法分析
词法分析的要求是:接受一个表达式,输出该表达式中的各类单词符号
一般有两种方法来进行词法分析,一种是用状态图来实现,一种是用状态转换表。下面采用状态图实现
首先定义单词符号的种类和所属类型
typedefenumSymbol{ERR=-1,END,NUM,PLUS,MINUS,TIMES,SLASH,LPAREN,RPAREN}Symbol;
然后转态转换图如下所示:
3
test1.c文件用代码表示如下:
#ifndefTEST1_C#defineTEST1_C/**
*采用状态图进行词法分析以及测试词法分析***/
#include\
//枚举类型
typedefenumSymbol{ERR=-1,END,NUM,PLUS,MINUS,TIMES,SLASH,LPAREN,RPAREN}Symbol;
//获取一个单词符号,该单词符号存放在strToken中。返回该单词符号的枚举类型
SymbolgetToken();
//根据传入的枚举类型输出对应的单词符号voidprintToken(Symboli);
//测试词法分析
voidtestLexAnalyse();
//获取一个单词符号,该单词符号存放在strToken中。返回该单词符号的枚举类型
SymbolgetToken(){
charch;
intstate=0;//每次都是从状态0开始intj=0;
//表达式遍历完成,单词符号为'#'
if(expression[expression_index]=='\\0'){
strToken[0]='#';strToken[1]='\\0';
returnEND;
4
}
while(1){
switch(state){
case0:
//读取一个字符
ch=strToken[j++]=expression[expression_index++];
if(isspace(ch)){j--;//注意退格}
elseif(isdigit(ch))state=1;elseif(ch=='+')elsebreak;
returnERR;state=2;state=3;state=4;state=5;state=6;state=7;
elseif(ch=='-')
elseif(ch=='*')elseif(ch=='/')elseif(ch=='(')elseif(ch==')')
state=0;
case1:
ch=strToken[j++]=exp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度高科技研发项目第三方抵押担保合同范本
- 2025年度国际旅游目的地市场营销策划合同
- 2025年度健身中心会员卡积分兑换实物奖品合同
- 2025年工业园区废弃物处理与资源化利用服务合同
- 2025年度数字经济产业纳税担保协议
- 2025年度生物制药研发合同补充协议
- 二零二五年度跨国公司分支机构设立合同标准
- 2025年度美容仪器产品认证及检测服务合同
- 2025年度绿色能源项目合作环境保护协议书范本
- 2025年度国际贸易惯例操作手册合同范本-@-1
- SolidWorks培训课件完整版
- 各期前列腺癌治疗的指南推荐
- 压力管理与情绪应对培训课件
- 提高预埋螺栓安装一次验收合格率五项qc2012地脚
- 六年级译林版小学英语阅读理解训练经典题目(附答案)
- GB/T 12332-2008金属覆盖层工程用镍电镀层
- 建设工程项目管理(课件)
- CQJTG∕T D09-2021 重庆市高速公路特殊路段交通安全设施设计指南
- 东洋(TOYO)VF64C系列变频器中文说明书
- 狄更斯与《圣诞颂歌》课件
- 康复科院感工作年度总结
评论
0/150
提交评论