⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 word_analysis.h

📁 用LL(1)方法分析四则运算
💻 H
字号:
#include <iostream>
enum{
	BUFSIZE = 20
};

struct Value
{
	int  i_value;
	char ope_value;
	char bou_value;
	int  place;		//current place for input 
	int  flag;		//1 for int,2 for operator,3 for bound,0 for nothing
};
typedef struct Value Value;

//判断是否为四则运算符
int isoperator(char c){
	return ( c=='+'||c=='-'||c=='*'||c=='/');
}
int isbound(char c){
	return ( c=='('||c==')' );
}

//去掉空白符
int getBlank(char *ch){
	int i=0;
	while(isspace(ch[i]))
		i++;
	return i;
}

//检查输入字符是否有效,即检查是否是四则运算符或数字
bool sym_valid(char ch){
	if(!(isdigit(ch) || isoperator(ch) || isbound(ch))){
	//	printf("%c: Input symbol Error!\n",ch);
		return 0; 
	}
	return 1;
}


char* concat(char ch,char* str)
{
	unsigned int len=strlen(str);
	if(len >= BUFSIZE)
	{
		printf("BUFFER OUTSIDE!");
		str[0]='\0';
		return str;
	}
	str[len]=ch;
	str[len+1] = '\0';
	return str;
}//concat

//词法分析函数	
Value& word_analysis(char* input){
	static struct Value value;
	char buff[BUFSIZE]={'\0'};
	int i=0,valid=0,k=0;
	//i 作为循环变量标示当前所指 input 中的字符位置
	//k 作为循环变量标示当前所指 buff  中的字符位置
	
	value.flag = 0;//初始化value为空值

	i = getBlank(input);

	valid = sym_valid(input[i]);
	if(valid == 0)
		return value;
	
	if(isdigit(input[i])){
		while(isdigit(input[i])){
			strcpy(buff,concat(input[i],buff));
			if(buff[0] == '\0')
				return value;
			i++;
		}//while
		i--;
		value.i_value = atoi(buff);
		value.flag = 1;
		valid = 1;
		value.place =i;
		return value;
	}//if
	else if(isoperator(input[i])){
		value.ope_value = input[i];
		value.flag = 2;
		valid = 1;
		value.place =i;
		return value;
	}//else if
	else {
		value.bou_value = input[i];
		value.flag = 3;
		value.place =i;
		valid = 1;
		return value;
	}//else

}//word_analysis


//读入字符返回类型 
// i ( )  + - * / 
char* read_sym(char* input){
	static char buff[BUFSIZE];
	int i=0,k=0;
	//if(input[0] == '#' && input[1] =='\0')
	//	return '#';

	Value v;
	while(input[i]!='#'){
		v = word_analysis(&input[i]);
		i += v.place;
		i++;
		switch(v.flag)
		{
			case 1:		buff[k]= 'i';//数字
						break;
			case 2:		buff[k]= v.ope_value;
						break;
			case 3:		buff[k]= v.bou_value;
						break;
			default:	printf("词法错误!\n");
						return NULL;
		}
		k++;
	}
	buff[k]='#';
	buff[k+1]='\0';
	return buff;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -