1、语法分析试验报告2 班孟志锋 学号 07710158一试验目的1、通过设计编制调试一个具体的语法分析程序,加深对语法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类语句的分析方法。2、通过练习,掌握对语句进行灵活处理的方法。 实验步骤1、明确语言语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。2、画出流程图、各函数之间的关系。3、编写、调试代码。4、测试,运行程序打开测试数据文件。 设计要求(1)对输入文法,它能判断是否为 LL(1)文法,若是,则转( 2) ;否则报错并终止;(2)输入已知文法,由程序自动生成它的 LL(1)分析表;(3)对于给定的输入串,
2、应能判断识别该串是否为给定文法的句型。分析该程序可分为如下几步:(1)读入文法 (2)判断正误 (3)若无误,判断是否为 LL(1)文法 (4)若是,构造分析表;(5)由总控算法判断输入符号串是否为该文法的句型。流程图是是源程序#include#include#include/*/int count=0; /*分解的产生式的个数 */开始读入文法有效?是 LL(1)文法?判断句型 报错结束int number; /*所有终结符和非终结符的总数*/char start; /*开始符号*/char termin50; /*终结符号*/char non_ter50; /*非终结符号 */char v
3、50; /*所有符号*/char left50; /*左部*/char right5050; /*右部*/char first5050,follow5050; /*各产生式右部的 FIRST 和左部的 FOLLOW 集合*/char first15050; /*所有单个符号的 FIRST 集合*/char select5050; /*各单个产生式的 SELECT 集合*/char f50,F50; /*记录各符号的 FIRST 和 FOLLOW 是否已求过*/char empty20; /*记录可直接推出的符号*/char TEMP50; /*求 FOLLOW 时存放某一符号串的 FIRST
4、集合*/int validity=1; /*表示输入文法是否有效*/int ll=1; /*表示输入文法是否为 LL(1)文法*/int M2020; /*分析表*/char choose; /*用户输入时使用*/char empt20; /*求_emp()时使用*/char fo20; /*求 FOLLOW 集合时使用*/*判断一个字符是否在指定字符串中*/int in(char c,char *p)int i;if(strlen(p)=0)return(0);for(i=0;i+)if(pi=c)return(1); /*若在,返回 1*/if(i=strlen(p)return(0);
5、/*若不在,返回 0*/*得到一个不是非终结符的符号*/char c()char c=A;while(in(c,non_ter)=1)c+;return(c);/*分解含有左递归的产生式*/void recur(char *point) /*完整的产生式在 point中*/int j,m=0,n=3,k;char temp20,ch;ch=c(); /*得到一个非终结符*/k=strlen(non_ter);non_terk=ch;non_terk+1=0;for(j=0;j) printf(“ninput error!“);validity=0;return(0); /*检测输入错误*/fo
6、r(k=0;k=0)firsti0=;firsti1=0;elseTEMP0=;TEMP1=0;elsefor(j=0;j+)if(vj=p0)break;if(i=0)memcpy(firsti,first1j,strlen(first1j);firstistrlen(first1j)=0;elsememcpy(TEMP,first1j,strlen(first1j);TEMPstrlen(first1j)=0;else /*如果右部为符号串*/for(j=0;j+)if(vj=p0)break;if(i=0)merge(firsti,first1j,2);elsemerge(TEMP,fi
7、rst1j,2);for(k=0;k=0)merge(firsti,first1m,2);elsemerge(TEMP,first1m,2);else if(_emp(pk)=1temp1=0;if(i=0)merge(firsti,temp,1); elsemerge(TEMP,temp,1);else if(_emp(pk)=0)break;/*求各产生式左部的 FOLLOW*/void FOLLOW(int i)int j,k,m,n,result=1;char c,temp20;c=non_teri; /*c 为待求的非终结符*/temp0=c;temp1=0;merge(fo,temp,1);if(c=start) /*若为开始符号*/temp0=#;temp1=0;merge(followi,temp,1);for(j=0;j=0;n-)Sp+=rightmn;Sq+strlen(rightm)=0;printf(“nS:%s str:“,S);for(p=j;p=0)printf(“M%d%d=%d “,i,j,Mij);printf(“n“);menu();执行结果(1)输入一个文法(2)输入一个符号串(3)再次输入一个符号串,然后退出程序