1、编译原理语法分析实验报告编译原理实验报告-语法分析班级:XXX学号:XXX姓名:XXX年 月 日 1、 摘要:用递归子程序法实现对pascal的子集程序设计语言的分析程序2、 实验目的:通过完成语法分析程序,了解语法分析的过程和作用3、 任务概述实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用4、 实验依据的原理递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,程序能
2、够按LL(1)形式唯一地确定选择某个候选式进行推导,最终识别输入串是否与文法匹配。递归子程序法的缺点是:对文法要求高,必须满足LL(1)文法,当然在某些语言中个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还是许多高级语言,例如PASCAL,C等编译系统常常采用的语法分析方法。为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的如下:。PROGRAM标识符; CONST;|标识符=无符号整数, |VAR |标识符:;,标识符 | |INTEGER | LONG;|PR
3、OCEDURE标识符;(标识符: )|;|标识符:=|()|IFTHENWHILEDO READ(标识符)WRITE(),|BEGINEND;|ODD+|-|e标识符|无符号整数|()+|-*|/ =|=5、 程序设计思想为每个非终结符设计一个识别的子程序,寻找该非终结符也就是调用相应的子程序。由于单词在语法分析中作为一个整体,故在语法识别中仅使用其内码。在这里将词法分析作为语法分析的一个子程序,当语法分析需要单词时,就调用相应的词法分析程序获得一个单词。语法分析的作用是识别输入符号串是否是文法上定义的句子,即判断输入符号串是否是满足“程序”定义的要求。也就是当语法识别程序从正常退出表示输入符
4、号串是正确的“程序”;若从出错退出,则输入符号串不是正确的“程序”。出错时,可以根据读字符的位置判断出错的位置。表2-1为非终结符和函数名对照表。表2-1 非终符和函数名对照表非终结符函数名非终结符函数名programprogheadblockconsexplconsdefivarexlconssuffvandefivarsuff过程说明部分procdefitypeilprocedhprocsuffassiprosentencesuffixifsentreadwhilsentidsuffwritecompsentexprsuffsentsuffconditiotermsuffexpresste
5、rmfactsuffargumentfactoraddopermuloperrespoper表2-2为词法分析中的内码单词对照表。表2-2 内部码对照表内码单词内码单词内码单词内码单词1PROGRAM2CONST3VAR4INTEGER5LONG6PROCEDURE7IF8THEN9WHILE10DO11READ12WRITE13BEGIN14END15ODD16+17-18*19/20=21222325=26.27,28;29:30:=31(32)33无符号整数34标识符35#6、 实验结果分析样例1:正确的pascal子集程序代码PROGRAM test;CONST b=3;VAR x:I
6、NTEGER;y:LONG;PROCEDURE c(d:INTEGER);BEGINd(5);x:=d+4;y:=b*2+2;END;BEGINWHILE x5 THEN x:=2*x-b;END.运行结果1:样例2:错误的pascal子集程序代码test;CONST b=3;VAR x:INTEGER;y:;PROCEDURE c(d:INTEGER);BEGINd(5);x:=d+4;y:=b*2+;END;BEGINWHILE x5 x:=2*x-b;END运行结果2:7、 总结通过本次实验,我能够用递归子程序法设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进
7、行语法检查和结构分析,更加了解了语法分析的过程和作用。附件:LEX代码:% #include #include #include FILE *fp; int line = 1;% delim t whitespace delim+ backspace nprogram pPrRoOgGrRaAmMconst cCoOnNsStTvar vVaArRinteger iInNtTeEgGeErRlong lLoOnNgGprocedure pPrRoOcCeEdDuUrReEif iIfFthen tThHeEnNwhile wWhHiIlLeEdo dDoOread rReEaAdDwrite
8、wWrRiItTeEbegin bBeEgGiInNend eEnNdDodd oOdDdDadd +minus -multiply *div /equal =m21 m22 m23 m25 =m27 ,m26 .m28 ;m29 :m30 :=m31 (m32 )constant (0-9)+identfier A-Za-z(A-Za-z|0-9)*% program fprintf(fp,%d %dn,1,line);const fprintf(fp,%d %dn,2,line);var fprintf(fp,%d %dn,3,line);integer fprintf(fp,%d %dn
9、,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,%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
10、fprintf(fp,%d %dn,14,line);odd fprintf(fp,%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 fprintf(fp,%d %dn,22,line);m23 fprintf(fp,%
11、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);m29 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);consta
12、nt _int64 maxnum=0xffffffff;if(strlen(yytext)10) printf(line %d constant error:%sn,line,yytext);elsefprintf(fp,%d %dn,33,line);identfier if(strlen(yytext)20) printf(line %d identfier error:%sn,line,yytext);elsefprintf(fp,%d %dn,34,line);whitespace backspace if(strcmp(yytext,n)=0)line+;% void main()
13、yyin=fopen(example.txt,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#include#include#includelex.yy.cusing namespace std;int token20002 = NULL;int h = 0; int i,j,p=0; void program();void blo
14、ck();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();void muloper();void proghead();void consexpl();void varexl();void vandefi();void p
15、rocdefi();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(); if (tokenh0 =26) h+; if (tokenh0 = 0) printf(语法分析完成n); else p=1;printf(第%d行缺少
16、.n,tokenh-11); return;void proghead() if (tokenh0 = 1) h+; if (tokenh0 = 34) h+; if (tokenh0 = 28) h+; else p=1;printf(第%d行缺少;n, tokenh-11); else p=1;printf(第%d行缺少标识符n, tokenh-11); else p=1;printf(第%d行缺少PROGRAMn, tokenh1); if (tokenh0 = 34) h+; if (tokenh0 = 28) h+; void block() consexpl(); varexl()
17、; procdefi(); compsent(); return;void consexpl() if (tokenh0 != 6 & tokenh0 != 3 & tokenh0 != 13) if (tokenh0 = 2) h+; consdefi(); conssuff(); if (tokenh0 = 28) h+; else p=1;printf(第%d行缺少;n, tokenh-11); else p=1;printf(第%d行缺少CONSTn, tokenh1); consdefi(); conssuff(); if (tokenh0 = 28) h+; return;void
18、 consdefi() if (tokenh0 = 34) h+; if (tokenh0 = 20) h+; if (tokenh0 = 33) h+; else p=1;printf(第%d行缺少无符号整数n, tokenh-11); else p=1;printf(第%d行缺少=n, tokenh-11); else p=1;printf(第%d行缺少标识符n, tokenh-11); if (tokenh0 = 20) h+; if (tokenh0 = 33) h+; return;void conssuff() if (tokenh0 != 6 & tokenh0 != 3 & t
19、okenh0 != 13) if (tokenh0 = 28)return; if (tokenh0 = 27) h+; consdefi(); conssuff(); else p=1;printf(第%d行缺少,n, tokenh-11); consdefi(); conssuff(); return;void varexl() if (tokenh0 != 6 & tokenh0 != 13) if (tokenh0 = 3) h+; vandefi(); varsuff(); else p=1;printf(第%d行缺少VARn, tokenh1); vandefi(); varsuf
20、f(); return;void vandefi() if (tokenh0 = 34) h+; idsuff(); if (tokenh0 = 29) h+; typeil(); if (tokenh0 = 28) h+; else p=1;printf(第%d行缺少;n, tokenh-11); else p=1;printf(第%d行缺少:n, tokenh-11); else p=1;printf(第%d行缺少标识符n, tokenh-11); idsuff(); if (tokenh0 = 29) h+; typeil(); if (tokenh0 = 28) h+; return;
21、void idsuff() if (tokenh0 = 4 | tokenh0 = 5) return; if (tokenh0 != 32 & tokenh0 != 29) if (tokenh0 = 27) 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 (tokenh0 = 4|tokenh0=5) h+; else p=1;printf(第%d行缺少INTEGER或LONGn, token
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2