实验13《编译原理》词法分析程序设计方案Word格式.docx
- 文档编号:22434795
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:21
- 大小:63.52KB
实验13《编译原理》词法分析程序设计方案Word格式.docx
《实验13《编译原理》词法分析程序设计方案Word格式.docx》由会员分享,可在线阅读,更多相关《实验13《编译原理》词法分析程序设计方案Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
else
then
单词助记符
内码值
-
10
11
12
13
14
15
16
17
18
while
switch
break
begin
end
标识符
数字(包括整数和实数)
id
num
在符号表中的位置
在常数表中的位置
19
20
21
22
23
24
25
26
27
+
*
/
%
(
)
[
]
28
29
30
!
=
<
>
==
;
{
}
rlop
37
38
39
40
41
42
43
44
45
/=
+=
-=
*=
%=
||
&
or
and
not
单词的构词规则:
字母=[A-Za-z]
数字=[0-9]
标识符=(字母|_)(字母|数字)*
数字=数字(数字)*(.数字+|ε)
四、S语言表达式和语句说明
1.算术表达式:
+、-、*、/、%
2.关系运算符:
、>
=、<
、<
=、==、!
3.赋值运算符:
=,+=、-=、*=、/=、%=
4.变量说明:
类型标识符变量名表;
5.类型标识符:
intcharfloat
6.If语句:
if表达式then语句[else语句]
7.For语句:
for(表达式1;
表达式2;
表达式3)语句
8.While语句:
while表达式do语句
9.S语言程序:
由函数构成,函数不能嵌套定义。
函数格式为:
返回值函数名(参数)
数据说明
语句
五、程序参考结构说明
1.Initscanner函数:
程序初始化:
输入并打开源程序文件和目标程序文件,初始化保留字表
2.Scanner函数:
若文件未结束,反复调用lexscan函数识别单词。
3.Lexscan函数:
根据读入的单词的第一个字符确定调用不同的单词识别函数
4.Isalpha函数:
识别保留字和标识符
5.Isnumber函数:
识别整数,如有精力,可加入识别实数部分工功能
6.Isanotation函数:
处理除号/和注释
7.Isother函数识别其他特殊字符
8.Output函数:
输出单词的二元式到目标文件,输出格式(单词助记符,单词内码值),如(int,-)(rlop,>
)……
9.Error函数:
输出错误信息到屏幕
10.除此之外,还可以设置查符号表,填写符号表等函数,学生可自行设计。
实验中,可以将某些类型的单词识别过程利用DFA算法实现,DFA算法参考如下:
DFA(S=S0,MOVE[][],F[],ALPHABET[],ALLS[])
/*S为状态,初值为DFA的初态,MOVE[][]为状态转换矩阵,F[]为终态集,ALPHABET[]为字母表,其中的字母顺序与MOVE[][]中列标题的字母顺序一致。
ALLS[]为状态集*/
CharWordbuffer[10]=“”//单词缓冲区置空
Nextchar=getchar();
//读字符
i=0;
while(nextchar!
=NULL)//NULL代表此类单词
{if(nextchar!
∈ALPHABET[]){ERROR(“非法字符”),return(“非法字符”);
S=MOVE[S][nextchar]//下一状态
if(S=NULL)return(“不接受”);
//下一状态为空,不能识别,单词错误
wordbuffer[i]=nextchar;
//保存单词符号
i++;
nextchar=getchar();
Wordbuffer[i]=‘\0’;
If(S∈F)return(wordbuffer);
//接受
Elsereturn(“不接受”);
六、实验过程说明
1.每人单独完成。
2.完成后,由老师验收,并给出成绩。
3.实验完成后,写出实验报告(要求交打印稿)。
报告内容要求如下:
完成人:
班级、学号、姓名
一、实验名称:
简化S语言词法分析器
二、实验目的:
通过手工编写简化C语言词法分析器,熟悉并深入理解编译程序词法分析器的工作原理。
三、实验内容:
1.根据保留字和特殊符号表能区分出源文件中的保留字、普通标识符和特殊符号,并能进行简单的错误处理。
…………
七、测试源程序示例:
//aa.c
voidaa()
floatrate,circle;
rate=3;
circle=3.14*rate*rate;
输出结果:
(1)输出结果文件:
(void,-)(id,0)((,-)(),-)({,-)(float,-)(id,1)……
(2)标识符的符号表:
Nametypeaddress
aa
rate
circle
(3)常数表:
Namevalue
3.14
实验地点:
教10五楼计算机学院软一机房
实验时间:
第4周周二3单元、周四1单元、第五周周二3单元
八、实验代码
#include<
stdio.h>
stdlib.h>
ctype.h>
string.h>
#defineMAX10//保留字符号长度
#defineMAXSIZE45//保留字和特殊符号表长度
#defineNUM30//标识符和常数的个数
FILE*in,*out;
//指向文件的指针
charinfile[MAX];
//文件名字
chartoken[MAX];
charWord[NUM][MAX];
//标识符
charconsts[NUM][MAX];
//常数
charlownum[NUM][MAX]={"
0"
"
1"
2"
3"
4"
5"
6"
7"
8"
9"
"
10"
11"
12"
13"
14"
15"
16"
17"
18"
19"
20"
21"
22"
23"
24"
25"
26"
27"
28"
29"
};
//自定义表
intn=1;
//行号
intnum=0;
//错误统计数
typedefstructKey_word//保留字和特殊符号表结构
//intkeyNum;
charkeyWord[MAX];
charkeySign[MAX];
charkeyValue[MAX];
}Key_word;
//初始化保留字表
Key_wordKey[MAXSIZE]={{"
int"
-"
},{"
char"
float"
},
{"
void"
const"
for"
if"
else"
then"
while"
switch"
break"
begin"
end"
"
id"
num"
+"
*"
/"
%"
("
)"
["
]"
rlop"
="
;
/="
+="
-="
*="
%="
||"
or"
and"
not"
}};
//打开关闭文件
intInitscanner()
printf("
请输入要输入的文件:
\n"
);
scanf("
%s"
infile);
if((in=fopen(infile,"
r"
))==NULL)
{
printf("
cannotopeninfile!
return0;
}
if((out=fopen("
word.txt"
a+"
cannotopenoutfile!
return0;
//写入文件
voidOutput(intn,intm)
fputs("
out);
fputs(Key[n].keySign,out);
if(m==-1)
fputs(Key[n].keyValue,out);
else
fputs(lownum[m],out);
//下标
//Isalpha函数:
intIsalpha()
inti;
for(i=0;
i<
16;
i++)//关键字
if(strcmp(token,Key[i].keyWord)==0)
{
Output(i,-1);
return0;
}
//标识符Word[NUM][MAX]
NUM;
i++)
if((Word[i][0]!
=NULL)&
strcmp(token,Word[i])==0)
Output(16,i);
if(Word[i][0]==NULL)
strcpy(Word[i],token);
intIsnumber()//Isnumber函数:
consts[NUM][MAX]
if((consts[i][0]!
strcmp(token,consts[i])==0)
Output(17,i);
if(consts[i][0]==NULL)
strcpy(consts[i],token);
voidremove()//扫描指针回退一个字符
fseek(in,-1,SEEK_CUR);
//Isanotation函数:
voidIsanotation()//提示第一个字符已经存为/了
charch,pre;
ch=getc(in);
if(ch=='
='
)//"
Output(36,-1);
elseif(ch=='
*'
/*"
ch=getc(in);
do{
if(feof(in))
{
num++;
printf("
\n第(%d)行:
注释错误:
/*后面的字符全部当做注释,缺少结束注释*/\n"
n);
break;
}
pre=ch;
ch=getc(in);
}while(pre!
||ch!
/'
else//"
remove();
//指针回退一个字符
Output(21,-1);
//Isother函数识别其他特殊字符
voidIsother()
{inti=1;
intj=0;
charch;
if(token[0]=='
'
||token[0]=='
%'
{
if(ch=='
token[i++]=ch;
else
remove();
elseif(token[0]=='
|'
remove();
else
token[i]='
\0'
for(i=18;
45;
break;
if(i==45)
num++;
字符错误:
%s字符非法\n"
n,token);
voidScanner()
while(!
feof(in))
while(ch=='
'
||ch=='
\t'
\n'
)//先统计行数
if(ch=='
++n;
if(((ch>
a'
)&
(ch<
z'
))||(ch=='
_'
))//标识符isalpha(ch)单词
i=1;
token[0]=ch;
while(((ch>
))||((ch>
0'
9'
)))//wordnumber
token[i++]=ch;
ch=getc(in);
token[i]='
Isalpha();
elseif((ch>
))//整数
while(isdigit(ch))
Isnumber();
elseif(ch=='
)//区分"
"
{
Isanotation();
else//特殊字符
Isother();
voidshow()
{
\n二元式:
rewind(out);
feof(out))
%c"
getc(out));
\n标志符表\n"
if(Word[i][0]!
=NULL)
%d,%s\n"
i,Word[i]);
\n常数表\n"
if(consts[i][0]!
i,consts[i]);
voidmain()
Initscanner();
Scanner();
\n共有%d个错误\n"
num);
show();
fclose(in);
fclose(out);
九、实验结果
输入文件
circle=3.14*rate;
/******/
输出文件
(void,-)
(id,0)
((,-)
(),-)
(begin,-)
(float,-)
(id,1)
(id,2)
(;
-)
(rlop,=)
(num,0)
(num,1)
(*,-)
(end,-)
十、实验总结
经过此次实验,了解了程序的词法构词规则和词法分析过程。
在实验过程中,得到了同学的帮助才得以完成。
本实验基本达到了老师的要求,实现了词法分析的基本功能。
B145112014405A114王自达
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 实验 13 编译 原理 词法 分析 程序设计 方案