




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省济南市长清第一中学大学科技园校区2025年物理高二第二学期期末学业水平测试试题含解析
- 上海市宝山区高境一中2025届物理高二下期末检测试题含解析
- 日喀则市2025届物理高二下期末复习检测模拟试题含解析
- 2025年湖南省祁东县第一中学物理高二第二学期期末考试模拟试题含解析
- 2025届浙江省名校协作体联盟物理高一下期末经典试题含解析
- 二零二五年环保设备买卖与环保项目合作合同
- 二零二五年度场监管总局全国合同示范文本库-政府采购合同示范文本
- 二零二五年度污水处理厂epc总承包合同
- 二零二五版参股合作投资合同范本解读
- 二零二五年度报关销售合同范本针对高新技术产品
- 2024年安徽电气工程职业技术学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- 人教版(2025新版)七年级下册数学第七章 相交线与平行线 单元测试卷(含答案)
- 《铁路技术管理规程》(普速铁路部分)
- 储能电站基础知识
- 夫妻婚内财产约定协议书范本(2025年)
- 信息技术设备互连 智能家居互联互通 第1部分:架构与要求 征求意见稿
- 2024年数智工程师职业鉴定考试复习题库(含答案)
- 北师大版数学六年级上学期期中试卷
- 中风脑梗死恢复期中医护理方案课件
- 《细菌毒素》课件
- 校长教职工大会讲话材料
评论
0/150
提交评论