1、11NE12GT13GE:14IS+15PL-16MI*17MU/18DI 文法:E T | E+T | E-T T F | T*F | T/F F i | (E)SLR(1)分析表状态ACTIONGOTO()i#ETFS4S5S6S7AccR3S8S9R6R8S15R1R2R4R5R7三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)(1)各.h和.c文件说明Cifa.cpp的功能:字符串扫描识别。Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO表。Yufa.cpp的功能:引用Cifa.c
2、pp、Table.cpp两个文件进行语法、语义的分析。(2)函数功能说明词法分析部分函数说明:int lookup (char *token) /比较是否是关键字 int GetChar(char ch) /每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。 int HandleError (void)/报错函数 int EXCUTE (int state, int symbol)/状态转换 int lookup (char *token) /比较是否是关键字void out(int a,char *token)/输出函数 void scann
3、er_example (FILE *fp)/词法分析语法、语义部分函数功能说明:void REPORT_ERROR()/报错函数void Accept()/语法成功接受int INDEX(char a)/获取当前字符串对应的索引void yuyi(int n)/语义子程序void INPUT(int a)/语法分析程序(2) 数据结构、各种表格、变量等的说明Cifa.cpp中:char *KeyWordTableMAX_KEY_NUMBER=begin,end, ifthenelse, KEY_WORD_END;/数组指针关键字int w,n,p,e,d;/w尾数累加器,n小数位数计数器,p指
4、数累加器,e指数符号标记,int Class;/标识单词类型Table.cpp#define MAXROW 16 /行数#define MAXCOL 11 /列数int TableMAXROWMAXCOLYufa.cpp中#define NUMBER 9/表达式的个数int StateMAXState;/状态栈int CURRENTSTATE=0;/标识当前状态int LENGTHNUMBER=1,3,3,1,3,3,1,3,1;/表达式右边的长度int Yes=0;/判断是否结束int tag=0;/判断是否需要调用词法程序四、系统工作过程及运行说明(使用操作指南)程序使用:在工程里创建一个
5、b.txt文件以识别算数运算表达式五、源程序清单(要求有详细注释)和实例程序运行结果源程序清单:Cifa.cpp#includectype.hstdlib.hstring.hmath.h#define DIGIT 1#define POINT 2#define OTHER 3#define POWER 4# define ID 6# define UCON 7# define LT 8# define LE 9# define EQ 10# define NE 11# define GT 12# define GE 13# define IS 14# define PL 15 /+# defi
6、ne MI 16 /-# define MU 17# define DI 18#define zuokuohao 19#define youkuohao 20#define jin 21#define ClassOther 200#define EndState -1#define MAX_KEY_NUMBER 20 /*关键字的数量*/#define KEY_WORD_END END /*关键字结束标记*/数组指针char TOKEN20;char ch;int ICON;double FCON;static int CurrentState=0;int result;int start=0
7、;/指示程序的开始int end=0;/指示程序的结束int GetChar (void);int EXCUTE (int,int);int HandleOtherWord (void) return ClassOther; int HandleError (void) printf (Error!n); return 0; int n=0; while (strcmp(KeyWordTablen, KEY_WORD_END) /*strcmp比较两串是否相同,若相同返回0*/ if (!strcmp(KeyWordTablen, token) /*比较token所指向的关键字和保留字表中哪个
8、关键字相符*/ return n+1; /*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/ break; n+; /*单词不是关键字,而是标识符*/int GetChar (char a) char c=a; if(isdigit(c) d=c-0; /字符c与字符0的ascii码差值,返回类型为一个整数 return DIGIT; if (c=.) return POINT;E|c=e) return POWER;+) return PL;-) return MU; return OTHER;void report_error( ) printf(错误nvoid out1
9、(int a,char *token)/输出函数 switch (a) case 1:printf(BEGIN, )nbreak; case 2:(END, )n case 3:(IF, )n case 4:(THEN, )n case 5:(ELSE, )n case 6:(ID,%s)n,token); case 8:(LT,%s)n case 9:(LE,%s)n case 10:(EQ,%s)n case 11:(NE,%s)n case 12:(GT,%s)n case 13:(GE,%s)n case 14:(IS,%s)n case 15:(PL,%s)n case 16:(MI
10、,%s)n case 17:(MU,%s)n case 18:(DI,%s)n case 19:(, )n case 20:(), )n default: report_error( );int out(int a) switch(a) case 7:return 6;/常量return 2;/+return 3;return 4;return 5;return 0;return 1; case 21:return 7; case 22:return 100;/判断是否是空格或换行 case 26: return 26;/标识符return 001;report_error();void sc
11、anner_example (FILE *fp)/文件扫描器 int i, c; ch=fgetc(fp); if(ch= |ch=n scanner_example (fp); else if (isalpha (ch) /判断是否是英文字母 TOKEN0=ch; i=1; while (isalnum (ch) TOKENi=ch; i+; ch=fgetc (fp); TOKENi=0 fseek(fp,-1,1); /* retract*/ c=lookup (TOKEN); if (c=0) /printf(算术表达式不需要n result=out(26); /标识符 if(c=1)
12、 start=1; out1 (c, if (c=2) end=1; out1(c, if (isdigit(ch)|ch=) /判断是否是数字或“.” i=0; /TOKENi=ch; if(isdigit(ch) d=ch- EXCUTE(CurrentState,DIGIT); if (ch=) EXCUTE(CurrentState,POINT);) EXCUTE(CurrentState,POWER);)EXCUTE(CurrentState,PL) ;) EXCUTE(CurrentState,MU); while(CurrentState!=EndState) TOKENi=ch
13、; i+; ch=fgetc(fp); int c=GetChar(ch); EXCUTE(CurrentState,c); / printf(UCON,%g)n,FCON); result=out(UCON);else switch(ch) /关系运算符 case =)out1(LE, else if(ch=) out1 (NE, else fseek (fp,-1,1); printf( / out (UCON); /out(EQ, ) /out(GE, /out(GT,case ch=fgetc(fp); printf( /out(IS, break;result=out(PL);res
14、ult=out(MI);*result=out(MU);/result=out(DI);(result=out(zuokuohao);)result=out(youkuohao);result=out(jin);case EOF:default:return;int EXCUTE (int state, int symbol) switch (state) case 0:switch (symbol) case DIGIT: n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON; case POINT: w=0;n=0;CurrentState=3; defaul
15、t: HandleOtherWord( );Class=ClassOther; CurrentState=EndState; w=w*10+d; /CurrentState=1 CurrentState=2; case POWER: CurrentState=4; FCON=w;CurrentState=EndState;w=w*10+d; FCON=w*pow(10,e*p-n);CurrentState=2; HandleError( ); p=p*10+d;CurrentState=6; case MU: e=-1;CurrentState=5; case PL: e=1; return
16、 CurrentState;int cifa(FILE *fp) CurrentState=0;/初始0状态 scanner_example (fp) ; return(result);#define S1 1#define S2 2#define S3 3#define S4 4#define S5 5#define S6 6#define S7 7#define S8 8#define S9 9#define S10 10#define S11 11#define S12 12#define S13 13#define S14 14#define S15 15#define R1 21#d
17、efine R2 22#define R3 23#define R4 24#define R5 25#define R6 26#define R7 27#define R8 28#define acc 100/SLR(1)分析表,2130表示规约,120表示移近,0报错int TableMAXROWMAXCOL=S4,0,0,0,0,0,S5,0,S1,S2,S3,0,0,S6,S7,0,0,0,acc,0,0,0,0,23,23,23,8,9,0,23,0,0,0,0,26,26,26,26,26,0,26,0,0,0,4,0,0,0,0,0,5,0,10,2,3,0,28,28,28,28,28,0,28,0,0,0,4,0,0,0,0,0,5,0,0,11,3,4,0,0,0,0,0,5,0,0,12,3,4,0,0,0,0,0,5,0,0,0,13,4,0,0,0,0,0,5,0,0,0,14,0,15,6,7,0,0,0,0,0,0,0,0,21,21,21,8,9,0,21,0,0,0,0,22,22,22,8,9,0,22,0,0,0,0,24,24,24,24,24,0,24,0,0,0,0,25,25,25,25,25,0,25,0,0,0,0,27,27,27,27,27,0,27,0,0,0;Yufa.cpp#includecifa.cpp
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1