编译原理语法分析实验报告_第1页
编译原理语法分析实验报告_第2页
编译原理语法分析实验报告_第3页
编译原理语法分析实验报告_第4页
编译原理语法分析实验报告_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

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

文档简介

1、班级:XXX学号:XXX姓名:XXX编译原理-语法分析年月 日1、摘要:用递归子程序法实现对 pascal的子集程序设计语言的分析程序2、实验目的:通过完成语法分析程序,了解语法分析的过程和作用3、任务概述实验要求:对源程序的内码流进行分析,如为文法定义的句子输出" 是“否则输出“否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用4、实验依据的原理递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的 串,当某非终结符的产生式有多个候选式时,程序能够按LL(1)形式唯一地确定

2、选择某个候选式进行推导,最终识别输入串是否与文法匹配。递归子程序法的缺点是:对文法要求高,必须满足 LL(1)文法,当然在某些语言中 个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还 是许多高级语言,例如PASCAL , C等编译系统常常采用的语法分析方法。为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的 BNF如下:程序 程序首部 分程序。程序首部-PROGRAM 标识符;分程序 常量说明部分 变量说明部分 过程说明部分 复合语句常量说明部分CONST常量定义

3、 常量定义后缀;|e常量定义 标识符=无符号整数常量定义后缀 , 常量定义 常量定义后缀 |e变量说明部分fVAR变量定义 变量定义后缀|e变量定义 标识符 标识符后缀 : 类型;标识符后缀 ,标识符 标识符后缀 |e变量定义后缀 变量定义 变量定义后缀|e类型 INTEGER | LONG过程说明部分 过程首部 分程序;过程说明部分后缀|e过程首部f PROCEDURE标识符参数部分;参数部分 (标识符:类型)| £过程说明部分后缀 过程首部 分程序;过程说明部分后缀|e语句 赋值或调用语句|条件语句|当型循环语句|读语句|写语句|复合语句| £赋值或调用语句 标识符后缀

4、后缀:= 表达式|(表达式)| £条件语句IF条件THEN语句当型循环语句 WHILE条件DO 语句读语句 f READ (标识符 标识符后缀)写语句-WRITE (表达式 表达式后缀)表达式后缀一,表过式 表达式后缀| e复合语句f BEGIN语句 语句后缀END语句后缀 一;语句 语句后缀| £条件 一表达式 关系运算符 表达式|ODD表达式表达式一+项 项后缀|-项项后缀|项项后缀项后缀 一加型运算符 项 项后缀| £项一 因子 因子后缀因子后缀 一乘型运算符 因子 因子后缀|e因子一标识符|无符号整数| (表达式)加型运算符一+|-乘型运算型一*|/关系运

5、算符 =|=|=5、程序设计思想为每个非终结符设计一个识别的子程序,寻找该非终结符也就是调用相应的子程 序。由于单词在语法分析中作为一个整体,故在语法识别中仅使用其内码。在这里将 词法分析作为语法分析的一个子程序,当语法分析需要单词时,就调用相应的词法分 析程序获得一个单词。语法分析的作用是识别输入符号串是否是文法上定义的句子, 即判断输入符号串是否是满足“程序”定义的要求。也就是当语法识别程序从正常退出表示输入符号串是正确的 “程序”;若从出错退出,则输入符号串不是正确的 “程序”。出错时,可以根据读字符的位置判断出错的位置。表2-1为非终结符和函数名对照表。表2-1非终符和函数名对照表非终

6、结符函数名非终结符函数名程序分程序program block程序首部常量说明部分proghead consexpl括里正义consdefi变量说明部分varexl常量定义后缀conssuff变量定义vandefi变量定义后缀varsuff过程说明部分procdefi旧typeil过程首1FB procedh过程说明部分后缀procsuff赋值或调用语句assipro语句sentence后缀suffix条件语句ifsent读语句read当型循环语句whilsent标识符后缀idsuff写语句write复合语句compsent表达式后缀exprsuff语句后缀sentsuff条件conditio项

7、后缀termsuff表达式express项term因子后缀factsuff参数部分argument因子factor加型运算符addoper乘型运算符muloper关系运算符respoper表2-2为词法分析中的内码单词对照表。表2-2 内部码对照表内码单词内码单词内码单词内码单词1PROGRAM2CONST3VAR4INTEGER5LONG6PROCEDURE7IF8THEN9WHILE10DO11READ12WRITE13BEGIN14END15ODD16+17-18*19/20=21<>22<23<=24>25>=26.27,28;2930:=31(32

8、)33无符号整数34标识符35#6、实验结果分析样例1:正确的pascal子集程序代码PROGRAM test;CONST b=3;VAR x:INTEGER;y:LONG;PROCEDURE c(d:INTEGER);BEGINd;x:=d+4;y:=b*2+2;END;BEGINWHILE x<10 DO x:=x+b;IF x>5 THEN x:=2*x-b;END.运行结果1:R C Wl N DO WSsy ste m3 2cmd. exe|文件打开成功! 情法分析开始 修法分析完成 Success!请按任意键继续,样例2:错误的pascal子集程序代码test;CONS

9、T b=3;VAR x:INTEGER;y:;PROCEDURE c(d:INTEGER);BEGINd;x:=d+4;y:=b*2+;END;BEGINWHILE x<10 DO x:=x+b;IF x>5 x:=2*x-b;END运行结果2:足 C Wl N DO WSsy ste m32cmd. exe文件打开成功!语法分析开始第1行映少PROGRAM第3行缺少INTEGER或LONG第8行缺少标识符或无符号整数第12行缺少THEN第13行缺少.Fail!请按任意键继续.7、总结通过本次实验,我能够用递归子程序法设计、编制、调试一个典型的语法分析程序, 实现对词法分析程序所提

10、供的单词序列进行语法检查和结构分析,更加了解了语法分 析的过程和作用。附件:LEX 代码:%#include <stdio.h>#include <stdlib.h>#include <string.h>FILE *fp;int line = 1;%delim " "twhitespace delim+backspace nprogram pPrRoOgGrRaAmMconst cCoOnNsStTvar vVaArRinteger iInNtTeEgGeErRlong lLoOnNgGprocedure pPrRoOcCeEdDuUrR

11、eEif iIfFthen tThHeEnNwhile wWhHiIlLeEdo dDoOread rReEaAdDwrite wWrRiItTeEbegin bBeEgGiInNend eEnNdDodd oOdDdDadd +minus -multiply *div /equal =m21 <>m22 <m23 <=m24 >m25 >=m27 ,m26 .m28 ;m29 :m30 :=m31 (m32 )constant (0-9)+identfier A-Za-z(A-Za-z|0-9)*%program fprintf(fp,"%d %

12、dn",1,line);const fprintf(fp,"%d %dn",2,line);var fprintf(fp,"%d %dn",3,line);integer fprintf(fp,"%d %dn",4,line);long fprintf(fp,"%d %dn",5,line);procedure fprintf(fp,"%d %dn",6,line);if fprintf(fp,"%d %dn",7,line);then fprintf(fp,&qu

13、ot;%d %dn",8,line);while fprintf(fp,"%d %dn",9,line);do fprintf(fp,"%d %dn",10,line);read fprintf(fp,"%d %dn",11,line);write fprintf(fp,"%d %dn",12,line);begin fprintf(fp,"%d %dn",13,line);end fprintf(fp,"%d %dn",14,line);odd fprintf(f

14、p,"%d %dn",15,line);add fprintf(fp,"%d %dn",16,line);minus fprintf(fp,"%d %dn",17,line);multiply fprintf(fp,"%d %dn",18,line);div fprintf(fp,"%d %dn",19,line);equal fprintf(fp,"%d %dn",20,line);m21 fprintf(fp,"%d %dn",21,line);m22

15、 fprintf(fp,"%d %dn",22,line);m23 fprintf(fp,"%d %dn",23,line);m24 fprintf(fp,"%d %dn",24,line);m25 fprintf(fp,"%d %dn",25,line);m26 fprintf(fp,"%d %dn",26,line);m27 fprintf(fp,"%d %dn",27,line);m28 fprintf(fp,"%d %dn",28,line);m2

16、9 fprintf(fp,"%d %dn",29,line);m30 fprintf(fp,"%d %dn",30,line);m31 fprintf(fp,"%d %dn",31,line);m32 fprintf(fp,"%d %dn",32,line);constant _int64 maxnum=0xffffffff;if(strlen(yytext)>10)printf("line %d constant error:'%s'n",line,yytext);els

17、efprintf(fp,"%d %dn",33,line);identfier if(strlen(yytext)>20)printf("line %d identfier error:'%s'n",line,yytext); elsefprintf(fp,"%d %dn",34,line);whitespace backspace if(strcmp(yytext,"n")=0)line+;%void main()yyin=fopen("example.txt",&quo

18、t;r");fp=fopen("data.txt","w");fclose(fp);fp=fopen("data.txt","a");yylex(); /* start the analysis*/fclose(yyin);fclose(fp);int yywrap()return 1;主程序代码:#include<string>#include<iostream>#include<fstream>#include"lex.yy.c" using n

19、amespace std;int token20002 = NULL;int h = 0;int i,j,p=0;void program();void block();void consdefi();void conssuff();void varsuff();void typeil();void procsuff();void sentence();void ifsent();void whilsent();void write();void exprsuff();void conditio();void express();void factsuff();void factor();vo

20、id muloper();void proghead();void consexpl();void varexl();void vandefi();void procdefi();void procedh();void assipro();void suffix();void read();void idsuff();void compsent();void sentsuff();void termsuff();void term();void argument();void addoper();void respoper();void program()proghead();block();

21、if (tokenh0 =26)h+;if (tokenh0 = 0) printf(" 语法分析完成n");elsep=1;printf(" 第 %d 行缺少 .n",tokenh-11);return;void proghead()if (tokenh0 = 1)h+;if (tokenh0 = 34)h+;if (tokenh0 = 28)h+;elsep=1;printf(" 第 %d 行缺少 ;n", tokenh-11);elsep=1;printf(" 第 %d 行缺少标识符n", tokenh-11

22、);elsep=1;printf(" 第 %d 行缺少 PROGRAMn", tokenh1);if (tokenh0 = 34)h+;if (tokenh0 = 28)h+;void block()consexpl();varexl();procdefi();compsent();return;void consexpl()if (tokenh0 != 6 && tokenh0 != 3 && tokenh0 != 13) if (tokenh0 = 2)h+;consdefi();conssuff();if (tokenh0 = 28)h

23、+;elsep=1;printf(" 第 %d 行缺少 ;n", tokenh-11);elsep=1;printf("第d 行缺少 CONSTn", tokenh1);consdefi();conssuff();if (tokenh0 = 28)h+;return;void consdefi()if (tokenh0 = 34)h+;if (tokenh0 = 20)h+;if (tokenh0 = 33)h+; else p=1;printf(" 第 %d 行缺少无符号整数n", tokenh-11);else p=1;print

24、f(" 第 %d 行缺少 =n", tokenh-11);elsep=1;printf(" 第 %d 行缺少标识符n", tokenh-11);if (tokenh0 = 20)h+;if (tokenh0 = 33)h+; return;void conssuff()if (tokenh0 != 6 && tokenh0 != 3 && tokenh0 != 13)if (tokenh0 = 28)return;if (tokenh0 = 27)h+;consdefi();conssuff();elsep=1;print

25、f(" 第 %d 行缺少 ,n", tokenh-11);consdefi();conssuff();return;void varexl()if (tokenh0 != 6 && tokenh0 != 13)if (tokenh0 = 3)h+;vandefi();varsuff();elsep=1;printf("第d 行缺少 VARn", tokenh1);vandefi();varsuff();return;void vandefi()if (tokenh0 = 34)h+;idsuff();if (tokenh0 = 29)h+

26、;typeil();if (tokenh0 = 28)h+;elsep=1;printf(" 第 %d 行缺少 ;n", tokenh-11);elsep=1;printf(" 第 %d 行缺少 :n", tokenh-11);elsep=1;printf(" 第 %d 行缺少标识符n", tokenh-11);idsuff();if (tokenh0 = 29)h+;typeil();if (tokenh0 = 28)h+;return;void idsuff()if (tokenh0 = 4 | tokenh0 = 5)retur

27、n;if (tokenh0 != 32 && tokenh0 != 29)h+;if (tokenh0 = 34)h+;idsuff(); else p=1;printf(" 第 %d 行缺少标识符n", tokenh-11);else p=1;printf(" 第 %d 行缺少 ,n", tokenh-11); return;void varsuff()if (tokenh0 != 6 && tokenh0 != 13)vandefi();varsuff(); return;void typeil()if (tokenh

28、0 = 4|tokenh0=5)h+;elsep=1;printf(" 第 %d 行缺少 INTEGER 或 LONGn", tokenh-11);return;void procdefi()if (tokenh0 != 13)procedh();block();if (tokenh0 = 28)h+;procsuff();elsep=1;printf(" 第 %d 行缺少 ;n", tokenh-11);return;void procedh()if (tokenh0 = 6)h+;if (tokenh0 = 34)h+;argument();if (

29、tokenh0 = 28)h+;elsep=1;printf(" 第 %d 行缺少 ;n", tokenh-11);elsep=1;printf(" 第 %d 行缺少标识符n", tokenh-11);elsep=1;printf(" 第 %d 行缺少 PROCEDUREn", tokenh1);if (tokenh0 = 34)h+;argument();if (tokenh0 = 28)h+; return;void read()if (tokenh0 = 11)h+;if (tokenh0 = 31)h+;if (tokenh0

30、 = 34)h+;idsuff();if (tokenh0 = 32)h+; else p=1;printf(" 第 %d 行缺少 )n", tokenh-11); elsep=1;printf(" 第 %d 行缺少标识符n", tokenh-11);elsep=1;printf(" 第 %d 行缺少 (n", tokenh-11);elsep=1;printf(" 第 %d 行缺少 READn", tokenh-11);exit(0);return;void ifsent()if (tokenh0 = 7)h+;

31、conditio();if (tokenh0 = 8)h+;sentence();elsep=1;printf("第d 行缺少 THENn", tokenh-11);sentence();elsep=1;printf("第 行缺少 IF'n", tokenh-11);exit(0);return;void assipro()if (tokenh0 = 34)h+;suffix();elsep=1;printf(" 第 %d 行缺少标识符n", tokenh-11);return;void procsuff()if (token

32、h0 != 13)procedh();block();if (tokenh0 = 28)h+;procsuff();else p=1;printf(" 第 %d 行缺少 ;n", tokenh-11);return;void sentence()if (tokenh0 != 14 && tokenh0 != 28)if (tokenh0 = 34)assipro();else if (tokenh0 = 7)ifsent();else if (tokenh0 = 9)whilsent();else if (tokenh0 = 11)read();else i

33、f (tokenh0 = 12)write();else if (tokenh0 = 13)compsent();return;void suffix()if (tokenh0 != 14 && tokenh0 != 28)if (tokenh0 = 30)h+;express();else if (tokenh0 = 31)h+;express();if (tokenh0 = 32)h+;else p=1;printf(" 第 %d 行缺少 )n", tokenh-11);elsep = 1; printf(" 第 %d 行缺少 (n"

34、, tokenh - 11); return;void whilsent()if (tokenh0 = 9)h+;conditio();if (tokenh0 = 10)h+; sentence();elsep=1;printf("第d 行缺少 DO'n", tokenh-11);elsep=1;printf(" %d 行缺少 WHILEn", tokenh-11); exit(0); return;void write()if (tokenh0 = 12)h+;if (tokenh0 = 31)h+;express();exprsuff();i

35、f (tokenh0 = 32)h+;elsep=1;printf(" 第 %d 行缺少 )n", tokenh-11);elsep=1;printf(" 第 %d 行缺少 (n", tokenh-11);elsep=1;printf(" 第 %d 行缺少 WRITEn", tokenh-11);exit(0);return;void compsent()if (tokenh0 = 13)h+;sentence();sentsuff();if (tokenh0 = 14)h+;elsep=1;printf("第d 行缺少 E

36、NDn", tokenh-11);elsep=1;printf(" %d 行缺少 BEGINn", tokenh-11);sentence();sentsuff();if (tokenh0 = 14)h+;return;void exprsuff()if (tokenh0 != 32)if (tokenh0 = 27)h+;express();exprsuff();else p=1;printf(" 第 %d 行缺少 ,n", tokenh-11);return;void sentsuff()if (tokenh0 = 28)h+;if (to

37、kenh0 != 14)sentence();sentsuff();else p=1;printf(" 第 %d 行缺少 ;n", tokenh-11);return;void conditio()if (tokenh0 = 15)h+;express();elseexpress();respoper();express();return;void termsuff()if (tokenh0 != 21 && tokenh0 != 22 && tokenh0 != 23 && tokenh0 != 24 &&

38、tokenh0 != 25 && tokenh0 != 32 && tokenh0 != 28 && tokenh0 != 14 && tokenh0 != 8 && tokenh0 != 10 && tokenh0 != 34)addoper();term();termsuff();void express()if (tokenh0 = 16|tokenh0=17)h+;term();termsuff();elseterm();termsuff();void term()factor();fact

39、suff();void factsuff()if (tokenh0 != 21 && tokenh0 != 22 && tokenh0 != 23 && tokenh0 != 24 && tokenh0 != 25 && tokenh0 != 32 && tokenh0 != 28 && tokenh0 != 14 && tokenh0 != 16 && tokenh0 != 17 && tokenh0 != 8 && tokenh0 != 10 && tokenh0 != 34)muloper();factor()

温馨提示

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

评论

0/150

提交评论