📄 changtotokens.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 + -