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

📄 changtotokens.h

📁 定义和实现了一个栈及其操作编译的时候只要用TC2.0或者WinTC打开Main.c文件进行编译就好了。如发现有Bug请在这里贴出来或者把修改后的代码跟帖在这里:)总之
💻 H
字号:
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0

//运算符定义:
#define O_NUMBER 8	//运算符个数,+-*/()i#
#define O_PLUS 0	// 加+
#define O_MINUS 1	// 减-
#define O_TIMES 2	// 乘*
#define O_SLASH 3	// 除/
#define O_L_PAREN 4	//左括号(parenthesis)
#define O_R_PAREN 5	//右括号
#define O_IDENT 6	//标识符
#define O_NUL 7		//语法界符#

char ch;	//存放取得的一个字符
char * ErrMsg;	//出错信息

//单词序列存放格式定义:
#define TOKEN_MAX_LENTH 100		//最大的单词长度+1
typedef struct 
	{
		char ch;	//存放字符:+-*/()i#E
		int No;	//存放算符优先关系表中的序号
		//double Value;	//当ch==i时,且为数值时,存放值的大小
	} SToken;
#define MAX_TOKEN_NUMBER 1000	//在一个表达式中允许最大的单词个数
SToken Token[MAX_TOKEN_NUMBER];	//单词序列,最后一个以“#”结束
int TokenNumber = 0;	//单词序列中包含的单词个数
int ipToken = 0;	//进行“移进-规约”时的位置指示

//从表达式缓冲区取一个字符,返回该字符的同时将它存于全局变量ch中
//成功:返回字符;不成功:返回'\0'
char GetChar() 
{
	if((ch = Buffer[ipBuffer]) != '\0')
		ipBuffer ++;
	return ch;
}

//从表达式缓冲区中取到下面第一个非空字符
//成功:返回字符;不成功:返回'\0'
char GetFirstChar()
{
	while(GetChar() != '\0')
	{
		if(ch>32) return ch;
	}
	return '\0';
}



//生成错误信息
//错误信息存于全局变量ErrMsg中
//返回:TRUE
bool MakeErr(char * ErrMassage)
{
	ErrMsg = ErrMassage;
	return TRUE;
}
//将表达式分割成单词序列
//结果:单词序列存于SToken Token[]中,单词个数存于TokenNumber中
//这是一个大模块,其中要调用一些子函数
//本函数只识别:运算符+-*/、括号()、无符号整数i,并在末尾添加#号
//				遇到其它任何字符都返回错误信息
//返回:TRUE表示成功;FALSE表示失败,同时将错误信息存于全局变量ErrMsg中
//使用到的其他全局变量:ch(取一个字符)、AToken[](取到的单词)
bool ChangeToTokens()
{
	TokenNumber = 0;
	if(GetFirstChar() == '\0') return ! MakeErr("表达式为空。");
	while(TRUE) //对缓冲区进行循环读
	{
		if(ch <= 32 && ch > 0) GetFirstChar(); //滤去空格
		switch(ch) //对单词的第一个进行判断,在下面一次处理整个单词
		{
		case '\0':
			Token[TokenNumber].ch = '#';
			Token[TokenNumber].No = O_NUL;
			return TRUE; //处理结束
		case '+':
			Token[TokenNumber].ch = '+';
			Token[TokenNumber].No = O_PLUS;
			GetChar();
			break;
		case '-':
			Token[TokenNumber].ch = '-';
			Token[TokenNumber].No = O_MINUS;
			GetChar();
			break;
		case '*':
			Token[TokenNumber].ch = '*';
			Token[TokenNumber].No = O_TIMES;
			GetChar();
			break;
		case '/':
			Token[TokenNumber].ch = '/';
			Token[TokenNumber].No = O_SLASH;
			GetChar();
			break;
		case '(':
			Token[TokenNumber].ch = '(';
			Token[TokenNumber].No = O_L_PAREN;
			GetChar();
			break;
		case ')':
			Token[TokenNumber].ch = ')';
			Token[TokenNumber].No = O_R_PAREN;
			GetChar();
			break;
		default:
			if(ch >= '0' && ch <= 'z') //整数
			{
				while(GetChar()>0)
				{
					if(ch<'0'||ch>'9'&&ch<'A'||ch>'Z'&&ch<'a'||ch>'z') break;
				}
				Token[TokenNumber].ch = 'i';
				Token[TokenNumber].No = O_IDENT;
			}
			else
			{
				return ! MakeErr("表达式中含有非法字符。");
			}
			break;
		}
		TokenNumber ++;
	}
}

⌨️ 快捷键说明

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