当前位置:文档之家› c语言编写的词法分析程序

c语言编写的词法分析程序

c语言编写的词法分析程序
c语言编写的词法分析程序

#include

#include

#include

#include

#define SPACE 0x20 //空格键

#define CHANGE 'c' //转义字符

#define STRING 'S' //引号里的字符串

#define BOUNDARY 'B' //界符

#define OPERATION 'O' //运算符

#define WORD 'I' //标识符

#define KEY_WORD 'K' //关键字

#define DIGIT 'n' //数字,包括小数

#define DOTH 'd' //头文件,“.h”文件

#define INT 't'

#define VOID 'v'

#define IF 'f'

#define ELSE 'e'

#define WHILE 'w'

#define FOR 'r'

#define MAIN 'm'

#define PRINTF 'p'

#define INCLUDE 'u'

#define FLOAT 'l'

#define KEYNUM 10

#define BOUNDNUM 8

#define OPERNUM 7

#define V ALUENUM 100

/************************************************************************/ /* data type */ /************************************************************************/ struct bianliang

{

int id;

char name[20];

int value;

};

struct changliang

{

int data;

};

KeyWord[KEYNUM][8]={"int","void","if","else","while","for","main","printf","include","float"} ;

char Boundary[BOUNDNUM]={'"',';',',','(',')','#','{','}'};

char Operation[OPERNUM]={'+','-','*','/','=','<','>'};

char

Logogram[KEYNUM]={INT,VOID,IF,ELSE,WHILE,FOR,MAIN,PRINTF,INCLUDE,FLOAT};

char Value[V ALUENUM][8];

int Value_n=0;

int ErrorLine=0;

int QuotationCount=0; //计算引号的数量

int QuotationFlag=0; //引号数量为奇数时为1,偶数时为0

char LastOpera=0; //用于判断"=="号存前一个"="号

/************************************************************************/

/* function describe */

/************************************************************************/

int isKeyWord(char* s) //是关键字返回1,否则返回0

{

int i;

for (i=0;i

{

if (strcmp(KeyWord[i],s)==0)

{

return i+1;

}

}

return 0;

}

int isBoundary(char ch) //是界符

{

int i;

for (i=0;i

{

if (Boundary[i]==ch)

{

return i+1;

}

}

return 0;

}

int isOperation(char ch) //是运算符

int i;

for (i=0;i

if (Operation[i]==ch)

{

return i+1;

}

}

return 0;

}

int isDigit(char *s) //是数字{

int i,l=strlen(s);

for (i=0;i

{

if (!isdigit(s[i]))

{

break;

}

}

if (i>=l)

{

return 1;

}

else

{

if ('.'==s[i])

{

i++;

for (;i

{

if (!isdigit(s[i]))

{

break;

}

}

}

else

{

return 0;

}

if (i>=l)

return 1;

else

return 0;

}

}

int isDotH(char *s) //是头文件{

int i,l=strlen(s);

for (i=0;i

{

if (!isalpha(s[i]))

{

break;

}

}

if (i>=l)

{

return 0;

}

else

{

if ('.'==s[i])

{

i++;

if(s[i]=='h')

return 1;

else

return 0;

}

else

return 0;

}

}

int isWord(char *s) //是标识符{

int i=0,l=strlen(s);

if (isalpha(s[i]))

{

i++;

for (;i

{

if (!isalnum(s[i]))

{

break;

}

}

}

if (i>=l)

{

return 1;

}

else

return 0;

}

void isWhat(int *i,char *str,FILE *fileOutput,FILE *fileOutput2) //判断字符串,并把相应类型存入文件

{

int n;

struct bianliang temp;

struct changliang t;

FILE *file=fopen("num.txt","ab");

if(1!=*i)

{

str[--(*i)]='\0';

if(n=isKeyWord(str))

{

fputs(str,fileOutput);

fputc('\t',fileOutput);

fputc(KEY_WORD,fileOutput);

fputc('\t',fileOutput);

if(isKeyWord(str)>9)

fputc(isKeyWord(str)+'a'-10,fileOutput);

else

fputc(isKeyWord(str)+'0',fileOutput);

fputc('\t',fileOutput);

fputc(Logogram[n-1],fileOutput);

fputc('\n',fileOutput);

}

else if(isWord(str))

{

fputs(str,fileOutput);

fputc('\t',fileOutput);

fputc(WORD,fileOutput);

fputc('\t',fileOutput);

for(n=0;n

{

if(0==strcmp(Value[n],str))

break;

}

if(n==Value_n)

{

n=++Value_n;

strcpy(Value[n-1],str);

temp.id=n-1;

strcpy(https://www.doczj.com/doc/8a5349530.html,,str);

temp.value=0;

fwrite(&temp,sizeof(struct bianliang),1,fileOutput2); fputc('0'+n,fileOutput);

}

else

{

fputc('0'+n+1,fileOutput);

}

fputc('\t',fileOutput);

fputc('i',fileOutput);

fputc('\n',fileOutput);

}

else if (isDotH(str))

{

fputs(str,fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc(DOTH,fileOutput);

fputc('\n',fileOutput);

}

else if (isDigit(str))

{

fputs(str,fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc(DIGIT,fileOutput);

fputc('\n',fileOutput);

t.data=atoi(str);

fwrite(&t,sizeof(struct changliang),1,file);

}

(*i)=0;

}

fclose(file);

}

void writeMessage(FILE *f)

{

fputs("字符\t类型\t附加值\t缩写\n",f);

}

void error()

{

printf("%d line error!\n",ErrorLine);

exit(1);

}

/************************************************************************/ /* main */ /************************************************************************/ void main()

{

FILE*fileInput;

FILE*fileOutput;

FILE*fileOutput2;

char ch,qtemp;

char str[20];

int i;

int flag=0;

fileInput=fopen("1.cpp","r");

fileOutput=fopen("object.txt","w");

fileOutput2=fopen("variable.txt","w");

writeMessage(fileOutput);

if (NULL!=fileInput)

{

i=0;

do

{

ch=fgetc(fileInput);

str[i++]=ch;

if(isBoundary(ch))

{

if(1==isBoundary(ch))

{

QuotationCount++;

if (0==QuotationCount%2)

{

QuotationFlag=0;

}

else

QuotationFlag=1;

}

isWhat(&i,str,fileOutput,fileOutput2);

fputc(ch,fileOutput);

fputc('\t',fileOutput);

fputc('B',fileOutput);

fputc('\t',fileOutput);

if(isBoundary(ch)>9)

fputc(isBoundary(ch)+'a'-10,fileOutput); else

fputc(isBoundary(ch)+'0',fileOutput);

fputc('\t',fileOutput);

fputc(Boundary[isBoundary(ch)-1],fileOutput); fputc('\n',fileOutput);

i=0;

}

else if(isOperation(ch))

{

if(0==QuotationCount%2)

{

isWhat(&i,str,fileOutput,fileOutput2);

if ('='==ch)

{

qtemp=fgetc(fileInput);

if ('='==qtemp)

{

fputc('=',fileOutput);

fputc('=',fileOutput);

flag=1;

}

else

{

fputc('=',fileOutput);

fseek(fileInput,-1,SEEK_CUR);

flag=0;

}

}

else

fputc(ch,fileOutput);

fputc('\t',fileOutput);

fputc(OPERA TION,fileOutput);

fputc('\t',fileOutput);

if(isOperation(ch)>9)

fputc(isOperation(ch)+'a'-10,fileOutput);

else

fputc(isOperation(ch)+'0',fileOutput);

fputc('\t',fileOutput);

if (flag)

{

fputc('q',fileOutput);

}

else

fputc(Operation[isOperation(ch)-1],fileOutput); fputc('\n',fileOutput);

i=0;

}

else

{

fputc(ch,fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc('c',fileOutput);

fputc('\n',fileOutput);

i=0;

}

}

else if('\n'==ch)

{

isWhat(&i,str,fileOutput,fileOutput2); ErrorLine++;

i=0;

}

else if(SPACE==ch||'\t'==ch)

{

if(1

isWhat(&i,str,fileOutput,fileOutput2); else

i=0;

}

else if ('\\'==ch)

{

if (1==QuotationFlag)

{

if (1!=i)

{

str[--i]='\0';

fputs(str,fileOutput);

fputc('\t',fileOutput);

fputc(STRING,fileOutput);

fputc('\n',fileOutput);

i=0;

}

ch=fgetc(fileInput);

if ('t'==ch)

{

fputc('\\',fileOutput);

fputc('t',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc(CHANGE,fileOutput);

fputc('\n',fileOutput);

i=0;

}

else if('b'==ch)

{

fputc('\\',fileOutput);

fputc('b',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc(CHANGE,fileOutput);

fputc('\n',fileOutput);

}

else if ('n'==ch)

{

fputc('\\',fileOutput);

fputc('b',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc('\t',fileOutput);

fputc(CHANGE,fileOutput);

fputc('\n',fileOutput);

i=0;

}

}

else error();

}

else if (1==QuotationFlag)

{

continue;

}

else if (isalnum(ch)||ch=='.')

{

}

else if (EOF!=ch)

{

error();

}

}while(EOF!=ch);

printf("词法分析完毕\n");

fclose(fileInput);

}

fclose(fileOutput);

fclose(fileOutput2);

}

/****************************************************/ /* 1.cpp 例子文件*/

#include

{

int i;

int j;

int m;

m=1;

for(i=0;i<5;i=i+1) {

printf("\t",i);

for(j=0;j

printf("\b",i);

}

for(j=0;j

printf("*",i);

}

printf("\n",i);

m=m+2;

}

}

相关主题
文本预览
相关文档 最新文档