分享
 
 
 

编译技术实现——词法分析

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

要做编译技术的实习了,想到csdn找几片相关的文章看看

没找到呀,这方面的也许很少

所以把我自己写的词法分析的源代码贴出来了

希望大家批评指正

#include "stdlib.h"

#include "stdio.h"

#include "iostream.h"

#include "fstream.h"

#include "string.h"

#include "ctype.h"

#include "malloc.h"

#define $ID 0

#define $ID_INT 1

#define $ID_CHAR 2

#define $ID_FLOAT 3

#define $ID_VOID 4

#define $ID_CONST 5

#define $ID_STATIC 6

#define $ID_IF 7

#define $ID_ELSE 8

#define $ID_DO 9

#define $ID_WHILE 10

#define $ID_SWITCH 11

#define $ID_CASE 12

#define $ID_DEFAULT 13

#define $ID_BREAK 14

#define $ID_CONTINUE 15

#define $ID_RETURN 16

#define $ID_DEFINE 17

#define $ID_INCLUDE 18

#define $INT 19

#define $ASSIGN 20

#define $ADD 21

#define $SUB 22

#define $MUL 23

#define $DIV 24

#define $LPAR 25

#define $RPAR 26

#define $LPAR_DIM 27

#define $RPAR_DIM 28

#define $LPAR_SEN 29

#define $RPAR_SEN 30

#define $EQUAL 31

#define $NOT_EQUAL 32

#define $LT 33

#define $GT 34

#define $LT_EQUAL 35

#define $GT_EQUAL 36

#define $COMMA 37

#define $DOT 38

#define $INTDIV 39

#define $COMMENT 40

#define $COMMENT_ASSIGN 41

#define $SENEND 42

#define $QUESTION 43

#define $NOT 44

struct Token

{

int ncode;

char *ntoken;

};

//////////////数组维数表及其处理

struct Dim

{

int uprange1;

int uprange2;

}Dim_table[20];

int Dimtable_index;

void Dimtable_Initiate()

{

for(int i=0;i<20;i++)

{

Dim_table[i].uprange1=0;

Dim_table[i].uprange2=0;

}

}

void Dimtable_Print()

{

cout<<"The CONTENTS of the Dim_table:\n";

for(int i=0;i<20;i++)

{

cout<

}

}

///////////关键字表及其处理

struct Reserve

{

int ncode;

char ntoken[20];

}word[20]={{0," "},{1,"int"},{2,"char"},{3,"float"},{4,"void"},{5,"const"},{6,"static"},

{7,"if"},{8,"else"},{9,"do"},{10,"while"},{11,"switch"},{12,"case"},{13,"default"},

{14,"break"},{15,"continue"},{16,"return"},{17,"define"},{18,"include"},{19," "}};

int Reserve_Search(char *search)

{

for(int i=0;i<20;i++)

{

//cout<<"i="<

if(strcmp(search,word[i].ntoken)==0)return i;

}

return 0;

}

void Reserve_Print()

{

for(int i=0;i<20;i++)

{

cout<

int index1=Idtable_Search(token);

if(index1==-1)

{

strcpy(Id_table[Id_table_index].name,token);

Id_table[Id_table_index].kind=1;

Id_table[Id_table_index].type=1;

Id_table[Id_table_index++].idform=1;

}

else

{

//重复定义error

}

}

void Idtable_Add_Uprange()

{

Id_table[Id_table_index-1].arrp=Dimtable_index;

}

void Idtable_Initiate()

{

for(int i=0;i<100;i++)

{

strcpy(Id_table[i].name,"");

Id_table[i].kind=0;

Id_table[i].type=0;

Id_table[i].idform=0;

Id_table[i].da=0;

Id_table[i].offset=0;

Id_table[i].arrp=-1;

}

}

void Idtable_Print()

{

cout<<"The CONTENTS of the Id_table:\n";

cout<<"i:="<<"i"<<"\t"<<"name"<<"\t"<<"kind"<<"\t"<<"type"

<<"\t"<<"idform"<<"\t"<<"da"<<"\t"<<"offset"<<"\t"

<<"arrp"< for(int i=0;i<100;i++)

{

cout<<"i:="<

<<"\t"<

<

}

}

static fstream infile;

char buffer[80];

int bufferlength=0;

int pbuffer=0;

char token[20];

char ch;

int line_number=0;

int error_number=0;

int isLetter(char ch)

{

if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z')))

return 1;

else

return 0;

}

int isDigit(char ch)

{

if(ch>='0'&&ch<='9')

return 1;

else

return 0;

}

int String_To_Int(char * source)

{

int i,result;

result=0;

int length=strlen(source);

for(i=0;i

{

result=result*10+((*(source+i))-'0');

}

return result;

}

//readline()从文件中读取一行到buffer中

int readline()

{

if(!infile.eof())

{

infile.getline(buffer,sizeof(buffer));

//cout<

bufferlength=strlen(buffer);

}

return bufferlength;

}

//getch()从buffer中读取一个字符到ch中

void getch()

{

if(bufferlength==0)readline();

//cout<

ch=buffer[pbuffer++];

//cout<

if(pbuffer>bufferlength)

{

readline();

pbuffer=0;

}

}

void getnbc()

{

while(ch==' ')

{

getch();

getnbc();

}

}

void concat()

{

//cout< int i=strlen(token);

//cout<

token[i++]=ch;

token[i]='\0';

}

void retract()

{

pbuffer--;

}

void error(char * string)

{

cout<<"Line("<

}

struct Token nexttoken()

{

struct Token temp;

strcpy(token,"");

getch();

getnbc();

if(isLetter(ch))

{

while(isLetter(ch)||isDigit(ch))

{

concat();

getch();

}

retract();

int result=Reserve_Search((char *)token);

//cout<<"result="<

if(result!=0)

{

temp.ncode=result;

temp.ntoken=token;

return temp;

}

else{temp.ncode=$ID;

temp.ntoken=token;

return temp;}

}

else if(isDigit(ch))

{

while(isDigit(ch))

{

concat();

getch();

}

retract();

temp.ncode=$INT;

temp.ntoken=token;

return temp;

}

else

{

switch(ch)

{

//20~30+

case '=':

getch();

if(ch!='='){temp.ncode=$ASSIGN;retract();}

else{temp.ncode=$EQUAL;}

temp.ntoken=token;

return temp;

case '+':

temp.ncode=$ADD;temp.ntoken=token;

return temp;

case '-':

temp.ncode=$SUB;temp.ntoken=token;

return temp;

case '*':

temp.ncode=$MUL;temp.ntoken=token;

return temp;

case '/':

temp.ncode=$DIV;temp.ntoken=token;

return temp;

case '(':

temp.ncode=$LPAR;temp.ntoken=token;

return temp;

case ')':

temp.ncode=$RPAR;temp.ntoken=token;

return temp;

case '[':

temp.ncode=$LPAR_DIM;temp.ntoken=token;

return temp;

case ']':

temp.ncode=$RPAR_DIM;temp.ntoken=token;

return temp;

case '{':

temp.ncode=$LPAR_SEN;temp.ntoken=token;

return temp;

case '}':

temp.ncode=$RPAR_SEN;temp.ntoken=token;

return temp;

case '!':

getch();

if(ch!='='){temp.ncode=$NOT;retract();}

else{temp.ncode=$NOT_EQUAL;}

temp.ntoken=token;

return temp;

case '<':

getch();

if(ch!='='){temp.ncode=$LT;retract();}

else{temp.ncode=$LT_EQUAL;}

temp.ntoken=token;

return temp;

case '>':

getch();

if(ch!='='){temp.ncode=$GT;retract();}

else{temp.ncode=$GT_EQUAL;}

temp.ntoken=token;

return temp;

case ',':

temp.ncode=$COMMA;temp.ntoken=token;

return temp;

case '.':

temp.ncode=$DOT;temp.ntoken=token;

return temp;

case '%':

temp.ncode=$INTDIV;temp.ntoken=token;

return temp;

case ';':

temp.ncode=$SENEND;temp.ntoken=token;

return temp;

case '?':

temp.ncode=$QUESTION;temp.ntoken=token;

return temp;

case ':':

getch();

if(ch!='='){temp.ncode=$COMMENT;retract();}

else{temp.ncode=$COMMENT_ASSIGN;}

temp.ntoken=token;

return temp;

default:

line_number++;

cout<<"get line :"<

getnbc();

temp.ncode=100;temp.ntoken=token;

return temp;

}

}

}

void main()

{

Idtable_Initiate();

Dimtable_Initiate();

struct Token TokenReturn;

infile.open("D:\\VC\\CompileProject\\data.txt",ios::in);

if(!infile)

{

cout<<"Conn't open the SOURCE file ,please CHECK it!\n";

abort();

}

while(!infile.eof())

{ //变量说明语句处理

TokenReturn=nexttoken();

cout<

cout<

if(TokenReturn.ncode==$ID_INT)//整型

{//2

do

{//3

TokenReturn=nexttoken();

if(TokenReturn.ncode==$ID)

{//4

Idtable_Insert_Int(TokenReturn.ntoken);

TokenReturn=nexttoken();//是不是数组说明

if(TokenReturn.ncode==$LPAR_DIM)

{//5

TokenReturn=nexttoken();

if(TokenReturn.ncode==$INT)

{//6

//在Dim_table中插入一项

Dim_table[Dimtable_index].uprange1=String_To_Int(TokenReturn.ntoken);

Idtable_Add_Uprange();

TokenReturn=nexttoken();

if(TokenReturn.ncode==$RPAR_DIM)

{//7

//是不是二维数组说明

TokenReturn=nexttoken();

if(TokenReturn.ncode==$LPAR_DIM)

{//8

TokenReturn=nexttoken();

if(TokenReturn.ncode==$INT)

{//9

//在Dim_table中插入一项

Dim_table[Dimtable_index].uprange2=String_To_Int(TokenReturn.ntoken);

Idtable_Add_Uprange();

Dimtable_index++;

TokenReturn=nexttoken();

if(TokenReturn.ncode==$RPAR_DIM)

{//10

TokenReturn=nexttoken();

}

else

{

error("缺少二维右括号");break;

}

}

else

{

error(" 缺少二维维数");break;

}

}//8

else

{//只有一维

Dimtable_index++;

}

}

else

{

error(" 缺少一维右括号");

}

}//6

else

{

line_number++;

error(" 缺少一维维数");

break;

}

}//

else if(TokenReturn.ncode==$LPAR)//函数说明

{

}

//变量名合法

}

else

{

error("变量名不合法");

}//4

}

while(TokenReturn.ncode==$COMMA);

if(TokenReturn.ncode!=$SENEND)

{

error(" 缺少';'");

}//3

}//2

else if(TokenReturn.ncode==$ID_FLOAT)

{

//FLOAT CHULI

}

else if(TokenReturn.ncode==$ID_VOID)

{

//void CHULI

}

else if(TokenReturn.ncode==$ID)//表达式处理

{

cout<<"表达式的处理:\n";

}

}

Idtable_Print();

Dimtable_Print();

}

lastking联系方式:leefelicity@hotmail.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有