编译原理Word下载.docx
- 文档编号:15924508
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:24
- 大小:255.67KB
编译原理Word下载.docx
《编译原理Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
5
(
6
)
7
三、实现方法与环境
1、首先设计识别各类单词的状态转换图。
描述无符号常数的确定、最小化状态转换图如图1所示。
其中编号0,1,2,…,6代表非终结符号<
无符号数>
、<
余留无符号数>
十进小数>
小数部分>
指数部分>
整指数>
及<
余留整指数>
,1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。
图1文法G[<
]的状态转换图
在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。
四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢线至一个新的终态即可。
根据自己的习惯,也可以将其转换为状态矩阵形式。
2、词法分析程序编写
根据描述语言中各类单词的文法状态转换图或状态矩阵,利用某种语言(C语言或JAVA语言)直接编写词法分析程序。
3、词法分析程序测试
用于测试扫描器的实例源文件中应有词法正确的,也应有错误的字符串,对于输入的测试用例的源程序文件,以对照的形式将扫描器的分析结果信息在输出文件中表示出来。
四、实验流程图
五、源代码
#include<
stdio.h>
#defineBUHEFA0//不合法
#defineWUFUHAO1//无符号数
#definePLUS2//加号
#defineSUB3//减号
#defineMUL4//乘号
#defineDIV5//除号
#defineLEFTBERACKET6//左括号
#defineRIGHTBRACKET7//右括号
chara[100];
char*DUSHU()//将文件中的字符串存储到数组a[i]
{
FILE*fp=fopen("
x.txt"
"
r"
);
inti=0;
fscanf(fp,"
%s"
a);
returna;
}
intisdigit(char*p)//判断接收字符是否为数字
{
charch=*p;
if(ch>
='
0'
&
ch<
9'
return1;
else
return0;
}
voidOut(inta,char*p1,char*p2)
{
printf("
类别码:
%d,\t\t符号值:
"
while(p1<
=p2)
printf("
%c"
*p1);
p1++;
}
\n"
voidSymbol(char*p)//判断接收字符是否为“+、-、*、\”符号
switch(ch)
case'
+'
:
Out(PLUS,p,p);
break;
case'
-'
Out(SUB,p,p);
*'
Out(MUL,p,p);
/'
Out(DIV,p,p);
('
Out(LEFTBERACKET,p,p);
)'
Out(RIGHTBRACKET,p,p);
default:
break;
voidmain()
词法开始,分析结果如下:
char*p;
p=DUSHU();
puts(p);
while(*p!
\0'
)//不是回车则判断
if(*p=='
||*p=='
)//判断符号
{
Symbol(p);
p++;
continue;
}
elseif(isdigit(p)||*p=='
.'
)//判断数字和点
char*p1=p;
if(isdigit(p))
{
while(isdigit(p))
p++;
if(*p=='
{
Out(WUFUHAO,p1,--p);
continue;
}
elseif(*p=='
E'
if(isdigit(p))
{
while(isdigit(p))p++;
Out(WUFUHAO,p1,--p);
p++;
continue;
}
elseif(*p=='
charch=*p;
while(isdigit(p))
p++;
else
Out(BUHEFA,p1,--p);
printf("
输入的这个符号是不合法的!
break;
while(isdigit(p))
if(*p=='
if(isdigit(p))
{
while(isdigit(p))
p++;
Out(WUFUHAO,p1,--p);
continue;
}
elseif(*p=='
if(isdigit(p))
{
while(isdigit(p))
p++;
Out(WUFUHAO,p1,--p);
continue;
}
else
Out(BUHEFA,p1,--p);
printf("
break;
else
Out(BUHEFA,p1,--p);
printf("
break;
else
}
elseif(*p=='
p++;
if(isdigit(p))
Out(BUHEFA,p1,--p);
printf("
break;
elseif(*p=='
)//判断是否为E
char*p2=p;
Out(BUHEFA,p2,--p);
printf("
break;
\n\n词法分析完毕!
六、实验结果
正确检验结果:
不合法结果:
七、实验过程问题分析记录
记录实验过程中发生的编译错误并分析错误原因和解决的方法及结果
编号
出错时间
出错代码
错误提示
出错原因分析
修改方法
修改结果
实验一第4课时
returna;
errorC4716:
'
DUSHU'
:
mustreturnavaluet'
没有返回值
加上return指令
消除了错误
continue;
errorC2018:
unknowncharacter'
0xa3'
符号写成了中文符号
修改符号
消除
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理