COMPILER简易词法分析程序Word文档格式.docx
- 文档编号:15877931
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:16
- 大小:40.19KB
COMPILER简易词法分析程序Word文档格式.docx
《COMPILER简易词法分析程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《COMPILER简易词法分析程序Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
2
常量
3
运算符
4
分界符
5
地址指针
int
float
main
printf
…
运算符表4
分界符表5
界符
,
;
(
)
算符
+
-
*
/
=
3.输出动态表格如下
常量表3
标识符表1
a
b
c
10
20
符号表
单词名称
类别
6
4.源码展示
#include<
string.h>
stdio.h>
stdlib.h>
ctype.h>
iostream.h>
iomanip.h>
#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'
a'
)))
{
return1;
elsereturn0;
intIsDigit(charc)//数字
if(c>
0'
c<
9'
)
intGetDelimiter(char*c)//界符
intm,i=0;
MAX_DELIMITER_NUM;
if(0==(m=strcmp(c,delimiter[i])))
intGetOperat(char*c)//运算符
if(0==(m=strcmp(c,operat[i])))
intInsertId(char*strToken)//插入标识符表
inti=0;
for(i=0;
labelnum;
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+'
word[1]='
'
word[2]=value+'
word[3]='
for(i=4;
17;
{word[i]=strToken[i-4];
fprintf(fop,word);
fprintf(fop,"
\n"
);
cout<
word<
voidscanner(FILE*fp)
{//扫描函数
charstrToken[20]={'
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]='
//'
代表字符结束(空格)
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;
i=1;
while(IsDigit(ch))
{
strToken[i]=ch;
i++;
ch=fgetc(fp);
}
strToken[i]='
fseek(fp,-1,1);
//回退
value=InsertConst(strToken);
retn($CONST,value,strToken);
}
else//开始判断的字符不是字母也不是数字
c=GetDelimiter(strToken);
//判断是否是分界符
if(c!
=0)
{
retn($DEL,c,strToken);
c=GetOperat(strToken);
//判断是否是运算符
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("
文件路径错误!
请重新输入:
\n请输入输出文件名(包括路径和后缀名):
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- COMPILER 简易 词法 分析 程序