COMPILER简易词法分析程序.docx
- 文档编号:2966930
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:16
- 大小:40.19KB
COMPILER简易词法分析程序.docx
《COMPILER简易词法分析程序.docx》由会员分享,可在线阅读,更多相关《COMPILER简易词法分析程序.docx(16页珍藏版)》请在冰豆网上搜索。
COMPILER简易词法分析程序
实验1.1手工编写简易词法分析程序
一、实验目的
1.通过设计、编写、调试一个具体的词法分析程序,加深对词法分析原理的理解。
2.掌握在对程序设计语言源程序进行扫描的过程中,将其分解为各类单词的词法分析方法。
二、实验平台
Windows+VC+Win32Console
范例程序:
“1-词法分析.c”
三、实验内容
1.实现下述功能,并将分析结果保存在文件中.
(既可以参考范例程序,也可以独立完成)
程序输入/输出示例:
1.输入一段C语言程序,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
输入源程序示例:
main()
{
inta,b=10;
intc;
c=a+b*20;
}
2.输出固定表格如下
保留字表2
单词类别表
单词类型
单词种别
标识符
1
保留字
2
常量
3
运算符
4
分界符
5
保留字
地址指针
int
1
float
2
main
3
printf
4
…
…
运算符表4
分界符表5
界符
地址指针
,
1
;
2
(
3
)
4
{
5
…
…
算符
地址指针
+
1
-
2
*
3
/
4
=
5
…
…
3.输出动态表格如下
常量表3
标识符表1
标识符
地址指针
a
1
b
2
c
3
常量
地址指针
10
1
20
2
符号表
单词名称
类别
地址指针
main
2
3
(
5
3
)
5
4
{
5
5
int
2
1
a
1
1
5
1
b
1
2
=
4
5
10
3
1
;
5
2
单词名称
类别
地址指针
int
2
1
c
1
3
;
5
2
c
1
3
=
4
5
a
1
1
+
4
1
b
1
2
*
4
3
20
3
2
;
5
2
}
5
6
4.源码展示
#include
#include
#include
#include
#include
#include
#defineMAX_DELIMITER_NUM6
#defineMAX_OPERAT_NUM10
#defineMAX_CONSTS_NUM20
#defineMAX_LABEL_NUM20
#define$ID1//标识符表
#define$KEY2//保留字表
#define$CONST3
#define$OPERAT4
#define$DEL5
FILE*fop;
char*Key[10]={"auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","redister","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};//定义保留字
char*delimiter[MAX_DELIMITER_NUM]={",",";","(",")","{","}"};//定义分界符
char*operat[MAX_OPERAT_NUM]={"+","-","*","/","=","<","<=","==",">=",">"};//定义运算符
charstrToken[20];//字符数组,存放构成单词符号的字符串
charch;//字符变量,存放最新读进的源程序字符
charmark[20];//用来存放标识符的数组
charcons[20];//用来存放常量的数组
intcode,value;
intr=0;
char*consts[MAX_CONSTS_NUM];
char*label[MAX_LABEL_NUM];//用来存放标识符的数组
intconstnum=0,labelnum=0;
//===================================================================================
intIsKey(char*strToken)
{//保留字
intm,i;
for(i=0;i<9;i++)
{
if(0==(m=strcmp(strToken,Key[i])))
{
return(i+1);
}
}
return0;
}
intIsLetter(charc)//字母
{
if(((c<='Z')&&(c>='A'))||((c<='z')&&(c>='a')))
{
return1;
}
elsereturn0;
}
intIsDigit(charc)//数字
{
if(c>='0'&&c<='9')
{
return1;
}
elsereturn0;
}
intGetDelimiter(char*c)//界符
{
intm,i=0;
for(i=0;i { if(0==(m=strcmp(c,delimiter[i]))) { return(i+1); } } return0; } intGetOperat(char*c)//运算符 { intm,i; for(i=0;i<9;i++) { if(0==(m=strcmp(c,operat[i]))) { return(i+1); } } return0; } intInsertId(char*strToken)//插入标识符表 { inti=0; for(i=0;i { if(strcmp(label[i],strToken)==0) { return(i+1); } } label[i]=(char*)malloc(sizeof(strToken)); strcpy(label[i],strToken); labelnum++; return(i+1); } intInsertConst(char*strToken)//插入常量表 { intj=0; //intr=0;//计数器作用定义为全局变量 char*cons[20]={'\0'}; cons[j]=strToken; r++; returnr; } intretn(intcode,intvalue,char*strToken) { inti; charword[17]; word[0]=code+'0'; word[1]=''; word[2]=value+'0'; word[3]=''; for(i=4;i<17;i++) {word[i]=strToken[i-4];} fprintf(fop,word); fprintf(fop,"\n"); cout< return0; } voidscanner(FILE*fp) {//扫描函数 charstrToken[20]={'\0'}; charch; inti,c; ch=fgetc(fp);//获取字符,指针fp并自动指向下一个字符 if(IsLetter(ch)) {//判断该字符是否是字母 strToken[0]=ch; ch=fgetc(fp); i=1; while(IsDigit(ch)||IsLetter(ch)) {//判断该字符是否是字母或数字 strToken[i]=ch; i++; ch=fgetc(fp); } strToken[i]='\0';//'\0'代表字符结束(空格) fseek(fp,-1,1);//回退一个字符 c=IsKey(strToken);//判断是否是关键字 if(c==0) { value=InsertId(strToken); retn($ID,value,strToken); } else { retn($KEY,c,strToken); } } else//开始判断的字符不是字母 if(IsDigit(ch))//判断是否是数字 { strToken[0]=ch; ch=fgetc(fp); i=1; while(IsDigit(ch)) { strToken[i]=ch; i++; ch=fgetc(fp); } strToken[i]='\0'; fseek(fp,-1,1);//回退 value=InsertConst(strToken); retn($CONST,value,strToken); } else//开始判断的字符不是字母也不是数字 { strToken[0]=ch; c=GetDelimiter(strToken);//判断是否是分界符 if(c! =0) { retn($DEL,c,strToken); } else strToken[0]=ch; c=GetOperat(strToken);//判断是否是运算符 if(c! =0) { retn($OPERAT,c,strToken); } else strToken[0]=ch; ch=fgetc(fp); } } main() { charin_fn[30];//文件路径 FILE*fp; printf("\n请输入源文件名(包括路径和后缀名): "); while(true) { gets(in_fn); if((fp=fopen(in_fn,"r"))! =NULL)break; elseprintf("文件路径错误! 请重新输入: "); } printf("\n请输入输出文件名(包括路径和后缀名): ");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- COMPILER 简易 词法 分析 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)