




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编写PL/0语言的词法分析程序要求: 1、读入用PL/0语言编写的源程序,正确的进行词法分析,并输出二元式序列。 2、若源程序有词法错误,能够给出出错的准确位置。 3、词法代号如下 (+,+); (-,-); (*,*); (/,/); (,(); (),); (,,,); (;,;); (.,.); (#,#); (=,=); (,); (,=,b); (=,c); (数字,d); (标识符,e); 关键字代号: (begin,f); (call,g); (const,h); (do,i); (end,j); (if,k); (odd,l); (procedure,m); (read,n);
2、 (then,o); (var,p); (while,q); (write,r); 4、等于运算符号为一个= 测试程序: A.C = CONSTA=10; VARB,C; PROCEDUREP; VARD; PROCEDUREQ; VARX; BEGIN READ(X); D:=X; WHILEX0 DOCALLP; END; BEGIN WRITE(D); CALLQ; END; BEGIN CALLP; END. */ /*programname:chifufenxi*/ /*作者:小万qq:*/ /*date:2004.10.11*/ #include #include #include
3、 #include #include #defineN256/每一行的字符数不能超过256个 charbufferN;/用作存放一行字符 charword20;/用作存放经过分析单词 char*kword13=begin,call,const,do,end,if,odd,procedure,read,then,var,while,write; charktype13=f,g,h,i,j,k,l,m,n,o,p,q,r; intlen;/记录每一行的长度 intcount=0;/用来记录行数 voidwrite(char*wstr,charwc,FILE*wout)/将分析结果按照规则写入到文件
4、 fputc(,wout); fputs(wstr,wout); fputc(,wout); fputc(wc,wout); fputc(),wout); intreadbuffer(FILE*fp) charch; len=0; ch=fgetc(fp); while(!feof(fp)&ch!=n)/读取字符到缓冲区 bufferlen=ch; ch=fgetc(fp); len+; len-;/用来控制词法分析时行分析中字母的个数 if(feof(fp)/标志文件是否结束 return0; else return1; voiderror(inttype) if(type=1) print
5、f(为无效字符,第%d行词法出错,标志符不能以数字开头n,count); elseif(type=2) printf(第%d行词法出错,赋值符应为:=n,count); elseprintf(为无效字符,第%d行词法出错n,count); voidcheck(char*str,FILE*out);/声明函数,此函数用来分类单词 voidfenxi(char*row,FILE*op)/此函数用来对每一行的单词进行语法分析 /printf(%dn,count); intk=0;/用作控制临时存放单词的变量str0 inti=0;/定义两个变量用作控制每一行是否结束, intferror=0;/用作
6、出错标志 charstr020;/临时存放单词的变量 while(i=len) k=0;/将k置0 strcpy(word,0);/将存放单词的变量清空 /*去除空格*/ if(isspace(rowi)/去出空格,跳格符,换行符 i+; continue; /*去出无效字符*/ while(!isalpha(rowi)&!isdigit(rowi)&i|rowi=|rowi=+|rowi=-|rowi=*|rowi=/|rowi=(|rowi=)|rowi=,|rowi=;|rowi=.|rowi=#|rowi=) putchar(rowi); i+; ferror=1;/设置错误标志符 i
7、f(ferror=1) error(3);/调用出错处理函数 ferror=0; /*对注释进行处理,假设此语言的注释只能单行注释以双斜杠“/”为注释开始标志*/ if(rowi=/) i+; if(rowi=/) i=len+1;/忽略注释符后面的单词 continue; else i-; /*判断是否为数字*/ if(isdigit(rowi) while(i|rowi=|rowi=+|rowi=-|rowi=*|rowi=/|rowi=(|rowi=)|rowi=,|rowi=;|rowi=.|rowi=#|rowi=) /当不到行尾,是数字或字母当然有可能是无效字符 if(isdigi
8、t(rowi)/是数字则将字符逐个存入临时数组 str0k=rowi; i+; k+; /putchar(e); else/数字中加有字母或无效字符则报错 /putchar(x); ferror=1;break;/已经出错设置标志并退出循环 if(ferror=1)/检测是否出错 /*将刚刚的那个单词后面的数字和字母 清空,如123abc123或则123$23等,当出现错误后,需 要消除abc123和$23以免误作为下一个标志符*/ for(intj=0;jk;j+) putchar(str0j); while(i|rowi=|rowi=+|rowi=-|rowi=*|rowi=/|rowi=
9、(|rowi=)|rowi=,|rowi=;|rowi=.|rowi=#|rowi=) putchar(rowi); i+; error(1);/putchar(e);/调用出错处理函数 ferror=0;/重新设置错误标志位 /i-;/strcpy(word,); else/未出错照常处理 str0k=0; strcpy(word,str0); i-;/减一是为了使最后取出的那个字符不在被下面的程序判断 /str00=0; /*判断是否为标志符和关键字即由字母开头并且不含标点符号用ispunct(intch)判断标点符号*/ if(isalpha(rowi)/标志符或关键字由字母开头 k=0
10、; while(i|rowi=|rowi=+|rowi=-|rowi=*|rowi=/|rowi=(|rowi=)|rowi=,|rowi=;|rowi=.|rowi=#|rowi=)/关键字和标志符由数字和字母组成 if(isalpha(rowi)|isdigit(rowi)/由数字和字母组成 str0k=rowi; i+; k+; else/出错,原因可能是出现了不可识别的字符 ferror=1;break; if(ferror) for(intj=0;jk;j+) putchar(str0j); while(i|rowi=的运算符后面的=再次被判断 if(rowi=:) i+; if(r
11、owi=) /word0=:; /word1=; /word2=0; strcpy(word,=); else error(2);/出错后调用处理函数 i-; if(rowi=) i+; if(rowi=) strcpy(word,=); else strcpy(word,); i-; if(rowi=) i+; if(rowi=) strcpy(word,=); else strcpy(word,);i-; /puts(word); check(word,op);/* 调用分类函数,辨别每一个单词的类别要求 输入的每一个单词必须符合词法规则*/ /word0=0; i+;/使指针后移,取出下
12、一个字母 voidcheck(char*str,FILE*out) if(isdigit(str0)/*如果第一个字符是数字那么整个单词都是数字组成的,即为常数*/ write(str,d,out);/调用写函数将分好类的单词写入文件 if(isalpha(str0)/*如果第一个字符是字母,那么这个单词是标志符或关键字*/ intfyiyong=0;/用作标记这个单词是否已被分类 /*以下判别是否是关键字*/ for(intct=0;ct) if(str1=) write(str,b,out); else write(str,out); if(str0=) if(str1=) write(s
13、tr,c,out); else write(str,out); if(!strcmp(str,:=) write(str,a,out); if(str0=+|str0=-|str0=*|str0=/|str0=(|str0=)|str0=,|str0=;|str0=.|str0=#|str0=) write(str,str0,out); voidmain() count=1; charscfilename20,rsfilename20;/定义用来存放输入源文件和输出目标文件的名字 printf(Pleaseinputyoursourcefilename:); gets(scfilename); printf(Pleaseinputyourresultfilename:); gets(rsfilename); FILE*fp,*op; fp=fopen(scfilename,r); op=fopen(rsfilename,w); if(fp)/打开文件成功后调用函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 平原县灌溉水源管理办法
- 煤矿竖井规范管理办法
- 短期劳务派遣管理办法
- 杨浦区外墙保洁管理办法
- 民兵救援车队管理办法
- 《债转股登记管理办法》
- 集团成本结算管理办法
- 屠宰场绩效考核管理办法
- 临时项目组管理管理办法
- 居住物业保安管理办法
- 新闻发布会培训
- 主管护师竞聘汇报
- 公园突发事件应急管理预案
- 第4单元-单元素养测评(B)-2024-2025学年语文部编版四年级上册(含答案解析)
- 2025年内蒙古农村信用社招聘笔试参考题库含答案解析
- 2025年云南省文山州教育局直属事业单位招聘27人历年管理单位笔试遴选500模拟题附带答案详解
- GA/T 2150-2024出入境证件智能签注设备
- 初中数学课后作业设计问题及优化探讨
- 档案库房安全
- 医疗机构感染预防与控制基本制度解读
- 星级绿色建筑评价评分表
评论
0/150
提交评论