设为首页 加入收藏

TOP

词法解析程序(一)
2014-11-24 00:04:09 来源: 作者: 【 】 浏览:48
Tags:词法 解析 程序

/**
* 2012年6月25日 中午
*
* 山东科技大学信息学院 版权所有
*
* 联系邮箱: www.2cto.com
*
* Copyright @ 2012, sdust, All Rights Reserved
*
* @author 王昌帅
*
*/
#include
#include
#include
#include

#define MAX_LENGTH 10
#define NUM_RESERVED_WORD 32
#define NUM_OPERATOR 5
#define NUM_SEPARATOR 16

//函数声明
void input(char*);
int judge(char*);
void parse2Array(char*);
int isChar(char c);
int isOperator(char c);
int isSeparator(char c);
int isNum(char c);
//输出信息
void output();
//判断是否是基本保留字(参数:字符串)
int isReservedWord_str(char* str);
//判断是否是操作符(参数:字符串)
int isOperator_str(char* str);
//判断是否是操作符(参数:字符串)
int isSeparator_str(char* str);
//判断是否是数字串(参数:字符串)
int isNum_str(char* str);
//判断是否是标识符(参数:字符串)
int isIndentifier_str(char* str);


//定义标识符
char sign_reserved_word[][MAX_LENGTH] = {"auto","double","int","struct","break","else","long","switch","case","enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","for","signed","void","default","goto","sizeof","volatile","do","if","while","static"};
char sign_operator[][MAX_LENGTH] = {"+","-","*","/","%"};
char sign_separator[][MAX_LENGTH] = {"\n"," ","\"","\t",",",";",":","'","<",">","(",")","{","}","[","]"};

//单词总数(包括运算符、分隔符等)
int wordNum = 0;
//解析好的单词
char array[200][20];

//主函数
int main()
{
char str[500];
while(1)
{
input(str);
parse2Array(str);
output();
}
}


//用于输入的函数
void input(char* str)
{
int i = 0,j = 0;
char c;
str[0] = '\0';
printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("请输入要解析的语句(esc退出):\n\n");
for(i=0;(c=getch())!='@';i++)
{
if(c==27)
exit(0);
if(c==8)
{
i-=2;
if(i<-1)
i=-1;
system("cls");
printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("请输入要解析的语句(esc退出):\n\n");
for(j=0;j<=i;j++)
{
printf("%c",str[j]);
}
continue;
}
else if(c==13)
{
str[i] = '\n';
printf("\n");
}
else
{
str[i] = c;
printf("%c",c);
}
str[i+1] = '\0';
}
}



//将输入的字符串解析成一个一个的单词
void parse2Array(char* str)
{
int count;
int i,temp;
wordNum = 0;
count = strlen(str);
for(i=0;i {
temp = i;
if(isOperator(str[i]))
{//如果是运算符
array[wordNum][0]=str[i];
array[wordNum][1]='\0';
wordNum++;
}
else if(isSeparator(str[i]))
{//如果是分隔符
array[wordNum][0]=str[i];
array[wordNum][1]='\0';
wordNum++;
}
else if(isChar(str[i]))
{//如果是字符
for(;str[i]!='\0'&&(!isOperator(str[i]))&&(!isSeparator(str[i]))&&(isChar(str[i])||isNum(str[i])||str[i]=='_');i++)
{
array[wordNum][i-temp]=str[i];
}
array[
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇洗牌算法 下一篇HDOJ 1024 Max Sum Plus Plus

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: