1、continue,3,do, 4,double, 5,else, 6,extern, 7,float, 8,for, 9,int, 10,if, 11,long, 12,short, 13,static, 14,switch, 15,void, 16,while, 17, bool, 18,false, 19,true, 20,sizeof, 21,FILE, 22,case, 23,default,24,return, 25;FILE *fp=NULL,*fpp;char str_charMaxlength;/字符数组str_char,用来依次存放一个单词词文中的各个字符char *err=
2、该字符未定义!nint strlength=sizeof keytab/sizeof keytab0;/计算keytable数组中的元素数量int comp(const void *a,const void *b);/qsort排序int compare_b(const void *a,const void *b);/besearch查找关键字表void integer(int n);void decimal(double m);void main() int ch; int i; /str_chari:max(i)=Maxlength double f; long n; keyword *f
3、lag;/判断搜索函数是否成功返回 int countid=70;/关键字的类别码已给出,而标识符类别码统一一码 int countnum=80;/整型数类别码统一一码 char *filename; fpp=fopen(schu.txt,w); filename=(char *)malloc(FILE_NAME_MAX); printf(请输入文件的名字: while(1) scanf(%s,filename); if(fopen(filename,r)!=NULL) break; printf(源文件打开失败,请再试一次!nn请输入文件的名字: fprintf(fpp,tt30n=tt31
4、ntt33n=tt34n=tt35n(tt36n)tt37n*tt38n:=tt40n+tt41n-tt42n?tt43n*tt39 n/tt46n,tt44ntt45n:tt47nn for(i=0;istrlength;i+) if(keytabi.value=3) fprintf(fpp,%st%dn,keytabi.word,keytabi.value); else%stt%dnnn while(ch=fgetc(fp)!=EOF) fputc(ch,fpp); fp=fopen(filename, qsort(keytab+1,strlength,sizeof(keyword),co
5、mp);= EOF) if(isspace(ch) /如果是一个空白字符 continue; else if(isalpha(ch) /它必须是一个标识符 str_char0=ch; ch=fgetc(fp); i=1; while(isalnum(ch) /一个字母数字字符 str_chari=ch; i+; ch=fgetc(fp); if(ivalue,str_char); else /是一个标识符 ,str_char,countid,str_char); else fprintf(fpp,err); else if(isdigit(ch) str_char0=ch; ch=fgetc(
6、fp); i=1; while(isdigit(ch)|ch=.) str_chari=ch; i+; if(iMaxlength) if(0=str_char0&str_char1!)%st(%s)nInvalid num,str_char);/0是第一个数字 %st(%d,str_char,countnum); f=(double)atof(str_char); if(f1e-9) fprintf(fpp,. decimal(f-n);)n else fprintf(fpp, switch(ch) case ch=fgetc(fp); if(ch=) =,LE, else if(ch=,N
7、E, else fseek(fp,-1,SEEK_CUR);%ct(%d,%c)n,LT, break; case ) fprintf(fpp,AS,CO,GE,GT, case ,EQ, break;,BH,CA,LB,RB,-,MI,+) fprintf(fpp,+,DPS,PS, *,DMU,MU,/,DI, default:( %c )还未定义!,ch);break; fclose(fp); fclose(fpp);tt程序结果以输出到源程序所在位置,输出文件名:schu.txt!int comp(const void *a,const void *b) return strcmp(
8、(keyword*)a)-word, (keyword*)b)-word);int compare_b(const void *a,const void *b) return strcmp(char*)a, (keyword*)b)-void integer(int n) if(n integer(n/NUM);%d,n%NUM);void decimal(double m) static int t=0; if(m0&t=16) m*=NUM; t+;,(long)m); decimal(m-(long)m);实验结果: 30= 31= 32 33= 34= 35( 36) 37* 38=
9、40+ 41- 42 43* 39 / 46, 44 45 47break 1char 2continue 3do 4double 5else 6extern 7float 8for 9int 10if 11long 12short 13static 14switch 15void 16while 17bool 18false 19true 20sizeof 21FILE 22case 23default 24return 25int i,j,n;double sum;n=10.5,mn=20,mm=0123;sum=0.5;for(i=0;=n;i+=1)if(sum0.2)j+;int (
10、10,int)i (70,i), (44,)j (70,j)n (70,n) (45,;double (5,double)sum (70,sum)= (35,=)10.5 (80,1010.1)mn (70,mn)20 (80,10100)mm (70,mm)Invalid num (0123)0.5 (80,0.1)for (9,for)( (36,()0 (80,0)= (31,=)+ (41,+)1 (80,1) (37,)( )还未定义!if (11,if) (30,0.2 (80,0.001100110011001)+ (48,+)( )还未定义!#include#define ma
11、x 50int count=0,L_End=0,flag=1,ll=1,Mmaxmax;char Start,Endmax,N_Endmax,Allmax,leftmax,rightmaxmax;char firstmaxmax,followmaxmax,first_smaxmax,selectmaxmax;int flag_firstmax,flag_followmax;char Emptymax,p_dedmax,TEMPmax,Follow_toolmax,choose;FILE *fpp;int Search(char c,char *p);char GetEnd();void Rec
12、ur(char *point);void N_recur(char *point);char Get_grammer(char *t,char *n);void Merge(char *d,char *s,int type);void Zhjtchu_k(char c);int Q_Zhjtchu_k(char c);int Judge_grammer();void FIRST_S(int i); void FIRST(int i,char *p); void FOLLOW(int i); int Judge_LL(); void Gzao_tab();void syntax(); bool
13、IsN_End(char a);bool Judge(char a,char *str);void MakeN_Endtab(char tempmax,int number);void MakeEndtab(char tempmax,int number);void menu(); int i,j;=NULL) break; freopen(filename,stdin); Start=Get_grammer(End,N_End);nn:表示为nn无左递归和回溯的文法数目:%d,分别是:,count);count;i+) printf(n%d:t%c%s,i+1,lefti,righti);n
14、开始字符:%c,Start); strcpy(All,N_End); strcat(All,End);nn该文法中所有字符:,All);n非终结字符:,N_End);n终结字符:%sn,End);nright:%s ,righti);nleft:%c ,lefti); if(flag=1) flag=Judge_grammer();nflag=%d,flag); if(flag=1),文法有效! ll=Judge_LL(); if(ll=1)printf(nLL=%d,该文法是一个LL1文法!nnt预测分析表为:,ll); if(ll=0)printf(nLL=%d,该文法不是一个LL1文法!
15、 else Gzao_tab(); printf(nt| for(i=0;=strlen(End); %ct,Endi);n_|strlen(End);_strlen(N_End); printf(%ct|,N_Endi); for(j=0;j=0) printf(%c%st ,N_Endi,rightMij); elseerrort printf( menu();char Get_grammer(char *E_str,char *N_str)/读入一个文法 char s,pmaxmax; int i,j,k;请输入文法产生式的条数:,&i);%dn,i); getchar();请输入文法的开始符号: scanf(s);%cn,s); for(j=1;=i;j+)请输入文法的第%d条(共%d条)产生式:,j,i);,pj-1); for(j=0;i; if(pj1!|pj2!n输入错误! flag=0; return /检测输入错误 MakeN_Endtab(p,i);/存储非终结字符 MakeEndtab(p,i);/存储终结字符
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1