c语言编写的词法分
析程序
精品文档
#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 VALUENUM 100
/************************************************************************/
/* data type */
收集于网络,如有侵权请联系管理员删除
精品文档
/************************************************************************/
struct bianliang {
int id;
char name[20]; int value; };
struct changliang {
int data; }; char
KeyWord[KEYNUM][8]={%ude\
char Boundary[BOUNDNUM]={'\char Operation[OPERNUM]={'+','-','*','/','=','<','>'}; char
Logogram[KEYNUM]={INT,VOID,IF,ELSE,WHILE,FOR,MAIN,PRINTF,INCLUDE,FLOAT};
char Value[VALUENUM][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 收集于网络,如有侵权请联系管理员删除