编译原理及实现-附录C-语法分析程序-代码(包含词法分析代码)_第1页
编译原理及实现-附录C-语法分析程序-代码(包含词法分析代码)_第2页
编译原理及实现-附录C-语法分析程序-代码(包含词法分析代码)_第3页
编译原理及实现-附录C-语法分析程序-代码(包含词法分析代码)_第4页
编译原理及实现-附录C-语法分析程序-代码(包含词法分析代码)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、TESTparse.cpp#include#include#include#includeint TESTparse();int program();int compound_stat();int statement();int expression_stat();int expression();int bool_expr();int additive_expr();int term();int factor();int if_stat();int while_stat();int for_stat();int write_stat();int read_stat();int declara

2、tion_stat();int declaration_list();int statement_list();int compound_stat();/token保存单词符号,token1保存单词值char token20 ,token140;/保存词法分析输出文件名extern char Scanout300;/用于指向输入文件的指针FILE * fp;/语法分析程序int TESTparse()int es = 0;if (fp = fopen(Scanout,r) = NULL)printf(n 打开文件 %s 错误! n, Scanout);es = 10;if (es = 0) e

3、s = program();printf(=语法分析结果! = n);switch (es)case 0: printf(语法分析成功!n); break;case 10:printf(打开文件%s失败!n,Scanout); break;case 1: printf(缺少 ! n);break;case 2: printf(缺少 ! n); break;case 3: printf(缺少标识符!n); break;case 4: printf(少分号! n); break;case 5: printf(缺少 (! n); break;case 6: printf(缺少)! n); break

4、;case 7: printf(狹少操作数! n); break;fclose(fp);return(es);/ :=/program: := int program()int es = 0;fscanf(fp, %s %sn, token, token1);printf(%s %sn, token, token1);if (strcmp(token, ) /判断是否为es = 1;return(es);fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es = declaration_list();if (es

5、 0) return(es);es = statement_list();if (es 0) return(es);if (strcmp(token, )/判断是否为,es = 2;return (es);return(es);/:= 1 /:=/ |e /3tJl : :* int declaration_list()int es=0;while (strcmp (token, int)= 0)es=declaration_stat();if(es0) return(es);return(es);/:=ID;/ : : = int ID; int declaration_stat()int

6、es=0;fscanf(fp, %s %sn, &token, &token1);printf (%s %sn,token, token1);if (strcmp (token, ID) return (es*3); /不是标识符fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1);if(strcmp(token,?) return(es=4);fscanf (fp, %s %sn, &token, &token1);printf (%s %sn,token, token1);return(es);/ := |e/ : :

7、= |e /改成 : :8= int statement_list()int es = 0;while (strcmp(token, )es = statement();if (es 0) return (es);return(es);/ : = | | 丨 |丨丨/ : : = | |/| |int statement()int es = 0;if (es = 0 & strcmp(token, if) = 0) es = if_stat(); /if (es = 0 & strcmp(token, while) = 0) es = while_stat(); / if (es = 0 &

8、strcmp(token, for) = 0) es=for_stat(); /if (es = 0 & strcmp(token, resd) = 0) es = read_stat(); / if (es = 0 & strcmp(token, write) = 0) es = write_stat();/ if (es = 0 & strcmp(token, ) = 0) es = compound_stat(); / if (es = 0 & (strcmp(token, ID) = 0 | strcmp(token, NUM) = 0 | strcmp(token, () = 0)

9、es = expression_stat();/return(es);/ : = if ( ) 4136/ : : = if ) else int if_stat()int es = 0; /iffscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);if (strcmp(token, ()if (es 0) return (es = 5); /少左括号fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es = expression();

10、if (es 0) return(es);if (strcmp(token, ;)if (es 0) return (es = 4);/少分号fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es = expression();if (es 0) return (es);if (strcmp(token, ) )if (es 0) return (es = 6); /少右括号fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es =

11、 statement(); if (es 0) return(es);if (strcmp(token, else) = 0) /else部分处理fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es = statement();if (es 0) return (es);return (es); / :=while ( ) / : : = while () int while_stat()int es=0;fscanf(fp,%s %sn,&token,&token1);printf (%s %sn,token

12、, token1);if (strcmp (token, ()if (es 0) return (es=5);/少左括号fscanf (fp, %s %sn, &token, &token1) ;printf(%s %sn, token, token1); es=expression(); if(es0) return(es);if (strcmp (token, )if (es 0) return (es= 6);/少右括号fscanf (fp, %s %sn,&token, &token1);printf(%s %sn,token,token1);es=statement();return

13、(es);/ : = for ( ; ; ) / : :=for ( ; ; ) int for_stat()int es = 0;fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);if (strcmp(token, ()if (es 0) return (es = 5);/少左括号fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1); es = expression();if (es 0) return (es);if (strcmp

14、(token, ) )if (es 0) return (es = 6);/少右括号fscanf(fp, %s %sn, &token, &token1);printf(%s.%sn, token, token1);es = statement();return(es);if (strcmp(token, ;)if (es 0) return (es = 4);/少分号fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es = expression();if (es 0) return (es);/ :=writ

15、e;/ : : = write; int write_stat()int es=0;fscanf (fp, %s %sn, & token, & token1); printf (%s %sn,token,token1);es=expression(); if (es0) return (es);if (strcmp(token, ;)if (es 0) return (es = 4);/少分号fscanf(fp, %s %sn,&token, & token1); printf(%s %sn,token,token1); return(es); / : 找日化变量;/ : : = resd

16、ID; int read_stat()int es=0;fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1);if (strcmp (token, ID)if (es 0) return(es=3) ;/例示识符fscanf(fp, %s %sn, &token, &token1);printf(%s %sn,token,token1);if(strcmp(token,;)if (es 0) return (es=4); /少分号fscanf (fp,%s %sn,&token,&token1); printf (%s %s

17、n,token, token1); return (es); /:-(/ : : = 一 : i ;- ,:; - -1int compound_stat() /复合语句函数int es=0;fscanf (fp,%s %sn,&token,&token1); printf (%s %sn,token, token1); es= statement_list(); return(es);/人:= ;丨; / : : = ; | ; int expression_stat()int es=0;if (strcmp (token, ;)= 0)fscanf(fp,%s %sn,&token,&to

18、ken1); printf (%s %sn,token,token1) ; return(es);es=expression();if(es0) return(es);if(es= 0 & strcmp (token, ;)= 0)fscanf (fp,%s %sn, &token, & token1); printf (%s %sn,token, token1); return(es);elsees=4;return (es);/少分号/ : = |/ : : = ID= | int expression()int es=0,filesdd;char token220,token340;if

19、 (strcmp(token, ID) = 0)filesdd = ftell(fp);/记住当前文件位置fscanf(fp, %s %sVi, &token2, &token3);printf(%s %sn, token2, token3 ) ;if (strcmp(token2, =) = 0)/ =fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es = bool_expr();if (es 0) return(es );elsefseek(fp, filesdd, 0);/若非= ,则文件指针回到=前的

20、标识符printf (%s %sn ,token, token1);es = bool_expr();if (es 0) return(es);else es = bool_expr();return (es) ;/ :算术表达式 | ( 丨=丨=|= f:!=)/-m.c.j/ : = /| ( |= | = | = | !*)int bool_expr()int es=0;es= additive_expr(); if (es0) return (es);if (strcmp (token, )= 0 |strcmp(token,) =0 |strcmp (token, )=0 |strc

21、mp (token, 0) return(es);return(es);/ := (+ | -) / : : = (+ | - ) int additive_expr()int es=0; es=term(); if(es0) return (es);while (strcmp(token, +) = 0 | strcmp(token, -) = 0)fscanf(fp, %s %sn, &token, &token1);printf(%s %sn, token, token1);es = term();if (es 0) return (es);return(es);/ :48 | ( *

22、| / ) )/ : :* ( * ( /) int term()int es=0;es= factor();if (es0) return (es);while(strcmp(token,*)=0|strcmp(token,/)= 0)fscanf(fp,%s %sn,&token,&token1); printf (%s %sn,token,token1); es= factor(); if (es0) return (es);return(es);/:( 丨 |/: := ()丨 ID|NUMint factor()int es=0;if (strcmp (token, ()= 0)fs

23、canf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1); es=expression(); if(es0) return (es);if (strcmp (token, ) ) return (es=6);/少右括号fscanf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1) ;elseif (strcmp(token, ID) = 0 | strcmp(token, NUM) = 0)fscanf(fp, %s %sn, &token, &token1);printf(%

24、s %sn, token, token1);return(es);elsees = 7; /缺少操作数return(es);return(es);TESTscan.cpp#include #include #include #define keywordSum 8char *keywordkeywordSum=if,else,for,while,do,int,read,write;/添加的保留字do;char singleword50=+ - * () ; , : ;char doubleword10= = ! ;char doublewordhe10=&;char doublewordhuo

25、10=|;/添加双分界符char doublewordjia10=+;extern char Scanin300,Scanout300;extern FILE * fin,*fout;int TESTscan()char ch,token40;int es=0,j,n;printf (请输入源程序文件名(包括路径):);scanf (%s,Scanin);printf (请输入词法分析输出文件名(包括路径):);scanf (%s,Scanout);if (fin=fopen(Scanin,r)=NULL)printf(n打开词法分析输入文件出错!n);return(1);if(fout=fo

26、pen(Scanout,w)=NULL)printf(n创建词法分析输出文件出错!n);return(2);ch=getc(fin);while(ch!=EOF)while (ch= | ch=n| ch=t)ch=getc(fin);if(isalpha(ch)token0=ch;j=1;ch=getc(fin);while(isalnum(ch)tokenj+=ch;ch=getc(fin);tokenj=0;n=0;while (n=keywordSum)fprintf(fout,%st%sn,ID,token);elsefprintf(fout,%st%sn,token,token);

27、else if (isdigit(ch)token0=ch;j=1;ch=getc(fin);while (isdigit(ch)tokenj+=ch;ch=getc(fin);tokenj=0;fprintf(fout,%st%sn,NUM,token);else if (strchr(doubleword,ch)0)token0=ch;ch=getc(fin);token1=0;fprintf(fout,%st%sn,token,token); else if(strchr(doublewordhe,ch)0)token0=ch; ch=getc(fin); if(ch=&) token1=ch;token2=0;ch=getc(fin);elsetoken1=0;fprintf(fout,%st%sn,token,token);/所加代码;else if(strchr(doublewordhuo,ch)0)token0=ch; ch=getc(fin); if(ch=|) token1=ch;token2=0;ch=getc(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论