哪里有这样的代码?
分不够可以再加。
写一个词法分析的给你参考下:[1]Basedata.h
#ifndef _BASETYPE_H
#define _BASETYPE_H
#define FALSE 0
#define TRUE 1
#define SPACE 0x20
#define BACKSPACE 0x08
#define ENTER 0x0d
#define ESC 0x1b
#define TABLE 0x09
#define ENDFILE -1
#endif
[2]Symbol.h
#ifndef _SYMBOL_H
#define _SYMBOL_H
#include <stdio.h>
#include <stdlib.h>
#define WORDLEN 13 //保留字个数
#define MAXIDLEN 50 //标识符最长长度
#define SYMBOLNUM 32 //种别码个数
typedef enum SYMBOL
{NOL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,
ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,
RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,
BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,
WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,
VARSYM,PROCSYM} SYMBOL;//定义种别码
void Getchar(void);
//取下一个字符
void Getbc(void);
//如当前字符为白字符,则读字符至不为白字符时停止
void Concat(void);
//将当前字符加入token字
void Retract(void);
//回退一字符
int Reserve(void);
//判断token字中单词是否是保留字
int Getsym(void);
//从当前文件中识别出一单词,并给出其类型和值
void Errorsym(void);
//打印错误信息
#endif
[3]Symbol.c
#include "basedata.h"
#include "symbol.h"
#include <conio.h>
#include <string.h>
#include <ctype.h>
char *WORD[WORDLEN]={"BEGIN","CALL","CONST","DO",
"END","IF","ODD","PROCEDURE",
"READ","THEN","VAR","WHILE",
"WRITE"
};//保留字字符串表,用于将保留字种别码转为字符串输出
SYMBOL WSYM[WORDLEN]={BEGINSYM,CALLSYM,CONSTSYM,
DOSYM,ENDSYM,IFSYM,ODDSYM,
PROCSYM,READSYM,THENSYM,
VARSYM,WHILESYM,WRITESYM};//保留字种别码表
char* SNAME[SYMBOLNUM]=
{"NOL","IDENT","NUMBER","PLUS","MINUS","TIMES",
"SLASH","ODDSYM","EQL","NEQ","LSS","LEQ","GTR",
"GEQ","LPAREN","RPAREN","COMMA","SEMICOLON",
"PERIOD","BECOMES","BEGINSYM","ENDSYM","IFSYM",
"THENSYM","WHILESYM","WRITESYM","READSYM",
"DOSYM","CALLSYM","CONSTSYM","VARSYM","PROCSYM"};
//单词字符串表,用于将保留字种别码转为字符串输出
SYMBOL sym;//最近已识的单词种别码
char token[MAXIDLEN+1];//最近已识别的单词
int num;//最近已识别的数字值
char ch;//最近已识别的字符
int col=1,row=1;//当前行和列值
FILE *fd;//指向待编译文件
extern FILE *fout;//指向存放结果文件
void Getchar(void)
{
ch=fgetc(fd);
if(ch!=EOF && ch!=\n)
col++;
return;
}
void Getbc(void)
{
while(ch==SPACE ||ch==TABLE ||ch==\n)
{
if(ch==\n) {row++;col=1;}
Getchar();
}//为空字符则一直读至不为空字符
}
void Retract(void)
{
fseek(fd,-1l,SEEK_CUR);
col--;
}
void Concat(void)
{
char temp[2];
temp[0]=ch;temp[1]=\0;
strcat(token,temp);
}
int Reserve(void)
{
int i,j;
char temp[60];
j=strlen(token);
for(i=0;i<j;i++)
{
temp[i]=toupper(token[i]);//将当前token字以大写形式存入temp中
}
temp[i]=\0;
for(i=0;i<WORDLEN;i++)
{
if(!strcmp(WORD[i],temp))
break;
}//判断当前token是否是保留字
if(i>=WORDLEN) i=-1;
return i;
}
void Errorsym(void)
{
fprintf(fout,
"There is error @row: %5d, @col: %5d",
row,col);
}
int Getsym(void)
{
int k;
int flag=TRUE;
Getchar();
Getbc();//滤掉白字符
strcpy(token,"");
if(isalpha(ch))
{
//以字母开头则是标识符
num=0;
Concat();
Getchar();
while(isalnum(ch))
{
Concat();
Getchar();
}
Retract();//由于超前搜索了,所以回退一个字符
k=Reserve();//判断此标识符是否是保留字
if(k!=-1)
{
sym=WSYM[k];//将保留字种别码存入sym中
}
else
{
sym=IDENT;//将一般标识符种别码存入sym中
}//end else k!=-1;
}//end of if isalpha
else if(isdigit(ch))
{
//以数字开头则为无符号整数
Concat();
Getchar();
while(isdigit(ch))
{
Concat();
Getchar();
}
if(isalpha(ch))
{
flag=FALSE;
while(isalnum(ch))
{
Concat();
Getchar();
}
}//end of flag=FALSE
Retract();//回退
if(flag)//若是无符号整数,则将整数值存于num中
{sym=NUMBER;num=atoi(token);}
}//end of if isdigit
else
{
num=0;
switch (ch)
{
case +:Concat();sym=PLUS;break;
case -:Concat();sym=MINUS;break;
case *:Concat();sym=TIMES;break;
case /:Concat();sym=SLASH;break;
case (:Concat();sym=LPAREN;break;
case ):Concat();sym=RPAREN;break;
case =:Concat();sym=EQL;break;
case #:Concat();sym=NEQ;break;
/*
ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,
RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,
*/
case ,:Concat();sym=COMMA;break;
case .:Concat();sym=PERIOD;break;
case ;:Concat();sym=SEMICOLON;break;
case >:
Concat();Getchar();
if(ch!==)//若后不跟=,则回退
{sym=GTR;Retract();}
else
{Concat();sym=GEQ;}
break;
case <:Concat();Getchar();
if(ch!==)
{sym=LSS;Retract();}
else
{Concat();sym=LEQ;}
break;
case ::Concat();Getchar();
if(ch!==)
{flag=FALSE;Retract();}
else
{Concat();sym=BECOMES;}
break;
default :flag=FALSE;break;
}//end of switch else char
}//end of else char
return flag;
}
[4]Testsym.c
#include "basedata.h"
#include "symbol.h"
#include <conio.h>
extern char *WORD[WORDLEN];
extern int WSYM[WORDLEN];
extern char* SNAME[SYMBOLNUM];
extern SYMBOL sym;//last readed word type;
extern char token[MAXIDLEN+1];//last readed word
extern int num;//last readed num;
extern char ch;//last readed char;
extern int col,row;
extern FILE *fd;
FILE *fout;
void Init(void);
void Quit(void);
void main()
{
int flag;
Init();
fprintf(fout,"\n TOKEN SYM NUM");
do{
flag=Getsym();
if(flag)
{
fprintf(fout,"\n%10s %10s %d",token,SNAME[sym],num);
}
else if(ch!=EOF)
{
fprintf(fout,"\n%10s",token);
Errorsym();
}
}while(ch!=EOF);//反复调用Getsym()识别单词,将输出结果存入fout中
Quit();
}
//======================================
void Init(void)
{
char temp[30];
printf("\nPlease input your file name:");
gets(temp);
if ((fd = fopen(temp,"rt"))
== NULL)
{
fprintf(stderr, "Cannot open input file %s.\n",temp);
getch();
return ;
}//将fd指针指向待分析源文件
if ((fout = fopen("mydata.dat", "wt"))
== NULL)
{
fprintf(stderr, "Cannot open input file.\n");
getch();
return ;
}//将fout指向文件mydata.dat
}
void Quit(void)
{
fclose(fd);
fclose(fout);
}
http://member.netease.com/~inetsoft/downloads/sourcecode/compiler/index.htm
里面有太多编译器的源代码