编译原理词法分析语法分析实验报告 联系客服

发布时间 : 星期一 文章编译原理词法分析语法分析实验报告更新完毕开始阅读e815a240148884868762caaedd3383c4bb4cb417

本文档如对你有帮助,请帮忙下载支持!

编译原理实验报告

一.LL(1)文法分析

1.设计要求

(1)对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并

终止;

(2)输入已知文法,由程序自动生成它的LL(1)分析表;

(3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。

2.分析

该程序可分为如下几步: (1)读入文法 (2)判断正误

(3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表;

(5)由总控算法判断输入符号串是否为该文法的句型。

3.流程图 4.源程序

语法分析程序

作者:xxx 学号:xxx #include #include #include

开始 是 是 是LL(1)文法?读入文法 报错 判断句型 /******************************************* 有效? ********************************************/ 结束 /*******************************************/ int count=0; /*分解的产生式的个数*/

int number; /*所有终结符和非终结符的总数*/ char start; /*开始符号*/ char termin[50]; /*终结符号*/ char non_ter[50]; /*非终结符号*/ char v[50]; /*所有符号*/ char left[50]; /*左部*/ char right[50][50]; /*右部*/

char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/

本文档如对你有帮助,请帮忙下载支持!

char first1[50][50]; /*所有单个符号的FIRST集合*/ char select[50][50]; /*各单个产生式的SELECT集合*/

char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/ char empty[20]; /*记录可直接推出^的符号*/

char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/ int validity=1; /*表示输入文法是否有效*/

int ll=1; /*表示输入文法是否为LL(1)文法*/ int M[20][20]; /*分析表*/

char choose; /*用户输入时使用*/ char empt[20]; /*求_emp()时使用*/ char fo[20]; /*求FOLLOW集合时使用*/ /******************************************* 判断一个字符是否在指定字符串中

********************************************/ int in(char c,char *p) { }

/******************************************* 得到一个不是非终结符的符号

********************************************/ char c() { }

/******************************************* 分解含有左递归的产生式

********************************************/ void recur(char *point)

{ /*完整的产生式在point[]中*/ int j,m=0,n=3,k;

char temp[20],ch; char c='A';

c++;

while(in(c,non_ter)==1)

return(c); int i;

if(strlen(p)==0) { }

return(0);

if(p[i]==c)

return(1); /*若在,返回1*/ if(i==strlen(p))

return(0); /*若不在,返回0*/ for(i=0;;i++)

本文档如对你有帮助,请帮忙下载支持!

ch=c(); /*得到一个非终结符*/ k=strlen(non_ter); non_ter[k]=ch; non_ter[k+1]='\\0';

for(j=0;j<=strlen(point)-1;j++) {

if(point[n]==point[0])

{ /*如果‘|’后的首符号和左部相同*/ } else

{ /*如果‘|’后的首符号和左部不同*/

left[count]=ch; right[count][0]='^'; right[count][1]='\\0'; count++;

for(j=n;j<=strlen(point)-1;j++) {

if(point[j]!='|')

temp[m++]=point[j]; else

{

left[count]=point[0];

memcpy(right[count],temp,m); right[count][m]=ch; right[count][m+1]='\\0';

printf(\m=0;

for(j=n+1;j<=strlen(point)-1;j++) {

while(point[j]!='|'&&point[j]!='\\0') }

temp[m++]=point[j++]; left[count]=ch;

memcpy(right[count],temp,m); right[count][m]=ch; right[count][m+1]='\\0'; m=0; count++; if(point[j]=='|') { }

n=j+1; break;

count++;

本文档如对你有帮助,请帮忙下载支持!

}

/******************************************* 分解不含有左递归的产生式

********************************************/ void non_re(char *point) {

int m=0,j;

char temp[20];

for(j=3;j<=strlen(point)-1;j++) {

if(point[j]!='|') }

temp[m++]=point[j]; else {

left[count]=point[0];

memcpy(right[count],temp,m); right[count][m]='\\0'; }

m=0; count++;

}

}

}

left[count]=point[0];

memcpy(right[count],temp,m); right[count][m]=ch;

right[count][m+1]='\\0'; count++; }

m=0;

left[count]=point[0];

memcpy(right[count],temp,m); right[count][m]='\\0'; count++; }

/******************************************* 读入一个文法

********************************************/ char grammer(char *t,char *n,char *left,char right[50][50]) {

char vn[50],vt[50]; char s; m=0;