词法分析

/*需要的库和全局变量、函数及主程序*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _KEY_WORD_END "waiting for your expanding" /*定义关键字结束标志*/

typedef struct
{
	int typenum;
	char* word;
}WORD;
char input[255]; //输入换缓冲区
char token[255] = "";    //单词缓冲区
int p_input;    //输入换缓冲区指针
int p_token; //单词缓冲区指针
char ch; //当前读入字符
char* rwtab[] = {"begin", "if", "then", "while", "do", "end", _KEY_WORD_END}; 
//可扩充的关键字数组 
WORD* scaner();     //词法扫描函数,获得一个单词
char m_getch();

int main()
{
	int over = 1;
	WORD* oneword = new WORD;
	printf("Enter Your Words(end with #):");
	scanf("%[^#]s",input);
	p_input = 0;
	printf("Your words:\n%s\n",input);
	while(over<1000 && over !=-1)
	{
		oneword = scaner();
		if(oneword->typenum < 1000)
			printf("(%d,%s)",oneword->typenum,oneword->word);
		over = oneword->typenum;
	}
	printf("\npress # to exit:");
	scanf("%[^#]s",input);
	return 0;
}

char m_getch()
{
	ch = input[p_input];
    p_input = p_input + 1;
	return (ch);
}


/*去掉空白符号*/
void getbc()
{
	while(ch == ' ' || ch == 10)
	{
		ch = input[p_input];
		p_input = p_input + 1;
	}
}


/*拼接单词*/
void concat()
{
	token[p_token] = ch;
    p_token = p_token + 1;
	token[p_token] = '\0';
}


/*判断是否字母*/
int letter()
{
	if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
		return 1;
	else return 0;
}


/*判断是否数字*/
int digit()
{
	if(ch >= '0' && ch <= '9')
		return 1;
	else return 0;
}


/*检索关键字表格*/
int reserve()
{
	int i = 0;
	while(strcmp(rwtab[i],_KEY_WORD_END))
	{
		if(!strcmp(rwtab[i],token))
		{
			return i + 1;
		}
		i = i + 1;
	}
	return 10;
}


/*回退一个字符*/
void retract()
{
	p_input = p_input - 1;
}


/*数字转换成二进制,请读者自己补全*/
char* dtb()
{
	return NULL;
}


WORD* scaner()
{
	WORD* myword = new WORD;
    myword->typenum = 10;
	myword->word = "";
	p_token = 0;
	m_getch();
	getbc();
	if(letter())
	{
		
		while(letter() || digit())
		{
			concat();
			m_getch();
		}
		retract();
		myword->typenum = reserve();
		myword->word = token;
		return (myword);
	}
	else if(digit())
	{
		while(digit())
		{
			concat();
			m_getch();
		}
		retract();
		myword->typenum = 20;
		myword->word = token;
		return (myword);
	}
	else switch(ch)
	{
case '=': m_getch();
	if(ch == '=')
	{
		myword->typenum = 39;
		myword->word = "==";
		return (myword);
	}
	retract();
	myword->typenum = 21;
	myword->word = "=";
	return (myword);
	break;
case '+': myword->typenum = 22;
	myword->word = "+";
	return (myword);
	break;
case '-': myword->typenum = 23;
	myword->word = "-";
	return (myword);
	break;
case '*': myword->typenum = 24;
	myword->word = "*";
	return (myword);
	break;
case '/': myword->typenum = 25;
	myword->word = "/";
	return (myword);
	break;
case '(': myword->typenum = 26;
	myword->word = "(";
	return (myword);
	break;
case ')': myword->typenum = 27;
	myword->word = ")";
	return (myword);
	break;
case '[': myword->typenum = 28;
	myword->word = "[";
	return (myword);
	break;
case ']': myword->typenum = 29;
	myword->word = "]";
	return (myword);
	break;
case '{': myword->typenum = 30;
	myword->word = "{";
	return (myword);
	break;
case '}': myword->typenum = 31;
	myword->word = "}";
	return (myword);
	break;
case ',': myword->typenum = 32;
	myword->word = ",";
	return (myword);
	break;
case ':': myword->typenum = 33;
	myword->word = ":";
	return (myword);
	break;
case ';': myword->typenum = 34;
	myword->word = ";";
	return (myword);
	break;
case '>': m_getch();
	if(ch == '=')
	{
		myword->typenum = 37;
		myword->word = ">=";
		return (myword);
	}
	retract();
	myword->typenum = 35;
	myword->word = ">";
	return (myword);
	break;
case '<': m_getch();
	if(ch == '=')
	{
		myword->typenum = 38;
		myword->word = "<=";
		return (myword);
	}
	retract();
	myword->typenum = 36;
	myword->word = "<";
	return (myword);
	break;
case '!': m_getch();
	if(ch == '=')
	{
		myword->typenum = 40;
		myword->word = "!=";
		return (myword);
	}
	retract();
	myword->typenum = -1;
	myword->word = "ERROR";
	return (myword);
	break;
case '\0':
	myword->typenum = 1000;
	myword->word = "OVER";
	return (myword);
	break;
default:
	myword->typenum = 1000;
	myword->word = "OVER";
	return (myword);
}

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值