?? 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 + -