3、io.h>//引入基本的库函数#include〈string.h>//引入字符串的库函数//状态表相关存储信息:#defineSTATE_NUMBER7//状态数目#defineCHAR_NUMBER4//输入字符的种类:.;d;e/E;+/-#defineDOT0//输入数字在状态表中位于第0列#defineDIGIT1//小数点位于状态表的第1歹IJ#defineE2//E位于状态表的第2列#defineAD3//+/-运算符位于状态表的第3列//State□□为状态表,以整数组形式存放,0,1,2,3,4,5,6表示状态,-1表示没有此状态intSt
4、ate[STATE_NUMBER][CHAR_NUMBER]={{1,2,3,-1},{-1,4,-1,-1],{1,2,3,-1},{-1,5,-1,6},{一1,4,3,-1},1-1,5,-1,-1),{-1,5,-1,-1}};intQ[STATE_NUMBER]二{0,0,1,0,1,1,0};〃终态标志:0非终态,1终态。intindex=0;//错误坐标//缓冲区://输入缓冲区:由专门函数操作(ReadALineO,GetChar0)#defineBUFFER_SIZE1000//表达式缓冲区大小charBuffer[BUFFER_SIZE
5、];//表达式缓冲区,以’ '表示结束intipBuffer二0;//表达式缓冲区当前位置序号charch;//存放取得的一个字符//函数声明:intRun();〃对存储在缓冲区的一行字符串(以'*'结束)进行运行voidInit();//全局初始化intReadALineO;//从键盘读一行(没有空格),存于表达式缓冲区Buffer[]中charGetChar();//从缓冲区取一个字符,返回该字符的同时将它存于全局变量ch中//主程序:voidmain(){InitO;whiIe(ReadALineO)//读一行成功,对它进行判断{if(Run0)/
6、/对该行进行运行,看是否能被接受?printf("Thenumberisright!rT);eIse{printf(,zThenumberiserror!,z);printfC错误位置在第%01个字符!",index);//显示错误位置}}}//对存储在缓冲区的一行字符串(以结束)进行运行//返回:如果是无符号定点实数,返回true;否则返回:falseintRun(){intS二0;//S存放运行时的当前状态,目前为初态index二0;while(GetChar()!二'*'){index++;if(ch>='O'&&ch<='9')/
7、/数字S二State[S][DIGIT];//将状态转换成输入数字后的状态elseif(ch=//小数点S二State[S][DOT];//将状态转换成输入小数点后的状态eIseif(ch二二’e'
8、
9、ch二二’E')//eS二State[S][E];//将状态转换成输入e后的状态eIseif(ch--,+'
10、
11、ch--,-')//+或-符号S二State[S][AD];//将状态转换成输入+或-后的状态elseif(ch=NULL)return0;else〃其他都为非法字符return0;if(S==-1)//处于非法状态return0;}//运行结束,
12、判断S是否为终态if(Q[S]=1)//终态return1;eIs