COMPILER简易词法分析程序Word文档格式.docx

上传人:b****4 文档编号:15877931 上传时间:2022-11-16 格式:DOCX 页数:16 大小:40.19KB
下载 相关 举报
COMPILER简易词法分析程序Word文档格式.docx_第1页
第1页 / 共16页
COMPILER简易词法分析程序Word文档格式.docx_第2页
第2页 / 共16页
COMPILER简易词法分析程序Word文档格式.docx_第3页
第3页 / 共16页
COMPILER简易词法分析程序Word文档格式.docx_第4页
第4页 / 共16页
COMPILER简易词法分析程序Word文档格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

COMPILER简易词法分析程序Word文档格式.docx

《COMPILER简易词法分析程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《COMPILER简易词法分析程序Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。

COMPILER简易词法分析程序Word文档格式.docx

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请输入输出文件名(包括路径和后缀名):

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1