char OG[OG_NUMBER][4] = {"E+E","E-E","E*E","E/E","(E)","i"}; //文法
右部
//单词序列存放格式定义:
#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; //进行“移进-规约”时的位置指示
//堆栈:由专门的函数操作(PopUp(),Push(),…)
#define STACK_MAX_SIZE 1000 //堆栈最大存储量
SToken Stack[STACK_MAX_SIZE]; //堆栈
int ipStack = 0; //堆栈指针,指向栈顶(下一个空位置)
//词法分析专用全局变量:
char ch; //存放取得的一个字符
//char AToken[TOKEN_MAX_LENTH]; //存放组成的单词,存放时以\0 为结束
//int ipAToken; //用于读字符时,指向下一个 AToken[]的位置,便于组成单词
//错误信息:
char * ErrMsg; //出错信息
//函数声明:
bool Judge(); //利用算符优先关系表判断单词序列是否正确
int GuiYue(); //规约,并判断是否完成
bool IsOK(); //判断规约是否全部完成
bool GuiYueN(int n); //将堆栈中 0~n 单词规约
int FindPriorOp(int Begin); //在堆栈中,从 Begin 开始,查找前一个终结符位置
int MoveIn(); //移进,并判断是否需要规约
void JudgeInit(); //(利用算符优先关系表判断单词序列是否正确)判断前的初始化