欢迎来到天天文库
浏览记录
ID:44668606
大小:181.69 KB
页数:11页
时间:2019-10-24
《语法分析程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验二语法分析程序设计计算机科学与技术(2)班[实验目的]:1.了解语法分析的主要任务。2.熟悉编译程序的编制。[实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程屮所用的产生式序列。[实验要求]:构造一个小语言的文法,例如,Pascal语言子集的算术表达式文法:G[〈表达式>]:〈表达式〉f〈表达式〉+〈项>I〈表达式〉项>I〈项〉〈项〉〈项>*〈因式>
2、〈项〉/〈因式>
3、〈因式〉<因式标识符>
4、<无符号整数>1(〈表达式〉)设计语法树的输出形式,例如:产生式1.2.G[E]:E->E+T
5、TT->T*F
6、
7、FF->i
8、(E)3.编写递归下降语法分析程序实现基木的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法算术表达式。实验报告中要说明分析使用的方法。4.生成并输出分析过程中所用的产生式序列:1产生式12产生式2[实验步!1.写出一个小语言的文法,根据情况口由选择C语言或Pascal语言。2.写出该小语言的算术表达式等价的1±(1)文法。S->l
9、oI->i(E)SPP->eSTE->O
10、1其屮小写字母为终结符,大写字母为非终结符,八为空。3.编写递归下降语法分析程序。调试运行程序。4.结果分析。5.撰写实验报告
11、。[实验报告]:1.写出实现的算法。1.画岀流程图。递归递归1.实验设计过程中出现的问题及解决的方法。写代码过程屮,有时会遇到数据异常,町以使川编译器本身的调试功能或者设宜一些标志量來检验。代码过于复朵时,比如木实验,应该先写出程序的主要代码,再添加那些输出代码。2.实验设计过程中的体会。在使用LL(1)算法时,先要写出1±(1)的文法,根据文法设计函数,弹药注意二义性的问题。3.给出程序清单。#include#include#include#include12、h>charinputstr[50],d[200],e[10];/*数组inputstr存输入串,数组d存推导式,*/intstrlong=0,Total=0,count=0,n=4;intS();int1();intP();intE();voidoutas();voidoutrmd();voidoutput();intmain()charch;inti=O,f;printf(”请输入字符串(长度v50,以#号结束)”);do{scanf(”%c”,&ch);inputstr[i]=ch;i++;}while(ch!='13、#');strlong=i;d[0]=S;dru==;d[2]=>,;d[3]=S;d⑷printf(”步骤t文法tt分析串t(分析字符t剩余串“);f=S();if(f==l)return1;if(inputstr[count++J==*#'){printf("accept!");i=0;ch=d[i];while(ch!=#'){printf(”%c“,ch);i++;ch=d[i];}}else{printf(”error!”);)return0;}intS()/*正确返回0,错误返回1*/{int14、f;if(inputstr[count++]=='i')charch[]=,,S=>r,;e[0」=S;e[l]==;c[2]=,>,;e[3]=T;eL4J=,#1;output();printf(H%dtS->Ittn,Total);outas();outnnd();Total++;f=I();if(f==l)return1;return0;}count—;if(inputstr[count++]==,o,){printf(',%dtS->ott,',Total);e[0]=S;e[l15、=he[2]->:c[16、3]=o*;e[4]=W,;output();outas();outrmd();Total++;return0;intK){intfl,f2,f3;printf(n%dtI->i(E)SPtH,Total);e[0]=T;c[l]==;e[2]=V;e[4]=Ce⑸二E;e[6]=T;e[7]=S;e[8J=P;e[9]=r#r;output();outas();outrmd();Total++;if(inputstr[count++]!=(r)return1;printf("%dtmatchtt",Total);17、outas();outrmd();Total++;fl=E();if(fl==l)return1;if(inputstr[count++J!=)f)return1;printfC*%dtmatchttM,Total);outas();outrmd();f2=S();if(f2==1)
12、h>charinputstr[50],d[200],e[10];/*数组inputstr存输入串,数组d存推导式,*/intstrlong=0,Total=0,count=0,n=4;intS();int1();intP();intE();voidoutas();voidoutrmd();voidoutput();intmain()charch;inti=O,f;printf(”请输入字符串(长度v50,以#号结束)”);do{scanf(”%c”,&ch);inputstr[i]=ch;i++;}while(ch!='
13、#');strlong=i;d[0]=S;dru==;d[2]=>,;d[3]=S;d⑷printf(”步骤t文法tt分析串t(分析字符t剩余串“);f=S();if(f==l)return1;if(inputstr[count++J==*#'){printf("accept!");i=0;ch=d[i];while(ch!=#'){printf(”%c“,ch);i++;ch=d[i];}}else{printf(”error!”);)return0;}intS()/*正确返回0,错误返回1*/{int
14、f;if(inputstr[count++]=='i')charch[]=,,S=>r,;e[0」=S;e[l]==;c[2]=,>,;e[3]=T;eL4J=,#1;output();printf(H%dtS->Ittn,Total);outas();outnnd();Total++;f=I();if(f==l)return1;return0;}count—;if(inputstr[count++]==,o,){printf(',%dtS->ott,',Total);e[0]=S;e[l
15、=he[2]->:c[
16、3]=o*;e[4]=W,;output();outas();outrmd();Total++;return0;intK){intfl,f2,f3;printf(n%dtI->i(E)SPtH,Total);e[0]=T;c[l]==;e[2]=V;e[4]=Ce⑸二E;e[6]=T;e[7]=S;e[8J=P;e[9]=r#r;output();outas();outrmd();Total++;if(inputstr[count++]!=(r)return1;printf("%dtmatchtt",Total);
17、outas();outrmd();Total++;fl=E();if(fl==l)return1;if(inputstr[count++J!=)f)return1;printfC*%dtmatchttM,Total);outas();outrmd();f2=S();if(f2==1)
此文档下载收益归作者所有