编译原理实验词法分析器的设计Word格式.docx
《编译原理实验词法分析器的设计Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验词法分析器的设计Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
![编译原理实验词法分析器的设计Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/9/764af28d-d93a-4df1-90ad-9cb7c756d4f9/764af28d-d93a-4df1-90ad-9cb7c756d4f91.gif)
单词种别码要求
保留字
if、else、int、while、do
每个保留字的单词种别都单独为一种
标识符
以字母开头且包含字母和数字的字符串
标识符作为一种
常数(只识别无符号整数)
123、343
无符号整数作为一种
运算符
+、-、*、/、=、==、!
=、>
、<
、>
=、<
=
每符一种,也可以每一类符号一种
分隔符
、;
、{、}、(、)
每符一种
2、上述要求仅为基本要求,可以在此基础上扩充,例如删除注释,增加识别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。
3、编程语言不限。
四、实验设计方案
1、数据字典
本实验用到的数据字典如下表所示:
标识ID
void、if、else、for、while、do、return、break、main、int、float、char、double、String
1
2
无符号整数和小数
3
+、-、*、/、=、>
、
4
5
本实验所使用的开发语言是C语言,在Test2类中定义了以下几个函数:
2.程序流程图:
Y
N
YN
N
YY
N
YN
YY
NN
YY
NNN
Y
NYN
3、实验程序
#include<
stdio.h>
string.h>
ctype.h>
windows.h>
//判断读入的字符是否为字母
boolisLetter(charc){
if((c>
='
a'
&
&
c<
z'
)||(c>
A'
Z'
)){
returntrue;
}
else
returnfalse;
}
//判断读入的字符是否为数字
boolisDigit(charc){
if(c>
='
0'
9'
){
//判断是否为关键字
boolisKey(char*string){
if(!
strcmp(string,"
void"
)||!
if"
)||!
for"
while"
)
||!
do"
return"
break"
)
main"
int"
float"
char"
double"
String"
))
{
returntrue;
elsereturnfalse;
boolisError(charch){
if(ch=='
'
||ch=='
$'
#'
~'
^'
returnfalse;
voidmain()
{
charstring[500]="
"
;
//存放文件中读出来的字符串
charstr[10]="
//存放需要对比的字符串
charch,c;
//ch存放文件中的单个字符(翻译时用),c存放文件中的单个字符(从文件中提取信息时用)
charfilename[20];
//文件名
intj=0;
printf("
请输入文件名进行词法翻译:
);
scanf("
%s"
filename);
FILE*cfPtr;
if((cfPtr=fopen(filename,"
r"
))==NULL)
printf("
文件未找到!
else{
while(!
feof(cfPtr)){
if(isspace(c=fgetc(cfPtr))){//判断是否是字符串
;
}else{
string[j]=c;
//从文件中一一提取字符
j++;
}
}
intm=0,k=0;
//m翻译时用,k是str数组的下标
string[j]='
'
j++;
boolcheck=true,error=false;
//用于判断标识
for(inti=0;
i<
j;
i++){//实现语法翻译器
switch(m)
{
case0:
ch=string[i];
if(ch=='
+'
-'
*'
/'
||ch=='
>
<
{
if(error){
printf("
%s,此字符无法是识别!
\n"
str);
error=false;
check=true;
}elseif(!
check){
(2,%s)标示符\n"
}
m=4;
}
elseif(ch=='
'
{'
}'
('
)'
{
%s此字符无法识别\n"
m=5;
}
elseif(isDigit((ch=string[i])))
if(check){
memset(str,0,strlen(str));
//清空
k=0;
str[k]=ch;
k++;
m=3;
check=false;
}else{
elseif(isLetter(ch=string[i]))
}else{
if(isKey(str))
{
printf("
(1,%s)关键字\n"
check=true;
}
}elseif(isError(ch=string[i])){
error=true;
}else{}
break;
case3:
if(isLetter(ch=string[i])){
printf("
程序有错误!
!
str[k]=ch;
k++;
error=true;
m=0;
break;
if(isError(ch=string[i])){
if(isDigit((ch=string[i])))
}elseif(ch=='
.'
str[k]=ch;
else
(3,%s)数字\n"
i--;
check=true;
case4:
i--;
printf("
(4,%c)运算符\n"
ch);
m=0;
case5:
i--;
(5,%c)分隔符\n"
}
return;
五、实验结果
六、实验小结
本次实验中,运用C语言进行实验,实验刚开始的时候,能够对输入的字符进行判断,但是却不能排错以及只能识别全是字母的标识符,后来经过修改程序代码和编程的逻辑最终实现了,既能排错又能分析句子;
通过实验掌握了词法分析,能实现对普通程序的语法分析翻译。