LL(1)语法分析程序资料

上传人:m**** 文档编号:510356074 上传时间:2022-11-26 格式:DOCX 页数:23 大小:139.79KB
返回 下载 相关 举报
LL(1)语法分析程序资料_第1页
第1页 / 共23页
LL(1)语法分析程序资料_第2页
第2页 / 共23页
LL(1)语法分析程序资料_第3页
第3页 / 共23页
LL(1)语法分析程序资料_第4页
第4页 / 共23页
LL(1)语法分析程序资料_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《LL(1)语法分析程序资料》由会员分享,可在线阅读,更多相关《LL(1)语法分析程序资料(23页珍藏版)》请在金锄头文库上搜索。

1、编译原理上机实验报告题目: LL(1) 语法分析程序1.设计要求(1)对输入文法,它能判断是否为 LL(1) 文法,若是,则转( 2);否则报错并终止;(2)输入已知文法,由程序自动生成它的LL(1) 分析表;(3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。2.分析该程序可分为如下几步:( 1)读入文法( 2)判断正误( 3)若无误,判断是否为 LL(1) 文法( 4)若是,构造分析表;( 5)由总控算法判断输入符号串是否为该文法的句型。3.流程图开始读入文法有效?是是 LL(1) 文法?是判断句型报错结束4.源程序/*LL1 语法分析程序*/#include#include#i

2、nclude/*/int count=0;/* 分解的产生式的个数 */int number;/* 所有终结符和非终结符的总数*/char start;/* 开始符号 */char termin50;/* 终结符号 */char non_ter50;/* 非终结符号 */char v50;/* 所有符号 */char left50;/* 左部 */char right5050;/* 右部 */char first5050,follow5050;/* 各产生式右部的FIRST 和左部的 FOLLOW 集合 */char first15050;/* 所有单个符号的FIRST 集合 */char s

3、elect5050;/* 各单个产生式的SELECT 集合 */char f50,F50;/* 记录各符号的FIRST 和 FOLLOW是否已求过 */char empty20;/* 记录可直接推出 的符号 */char TEMP50;/* 求 FOLLOW 时存放某一符号串的FIRST 集合 */int validity=1;/* 表示输入文法是否有效*/int ll=1;/* 表示输入文法是否为LL(1) 文法 */int M2020;/* 分析表 */char choose;/* 用户输入时使用 */char empt20;/* 求_emp()时使用 */char fo20;/* 求 F

4、OLLOW集合时使用 */*判断一个字符是否在指定字符串中*/int in(char c,char *p)/int i;size_t i;if(strlen(p)=0)return(0);for(i=0;i+)if(pi=c)return(1);/* 若在,返回1*/if(i=strlen(p)return(0);/* 若不在,返回0*/*得到一个不是非终结符的符号*/char c()char c=A;while(in(c,non_ter)=1)c+;return(c);/*分解含有左递归的产生式*/void recur(char *point)/* 完整的产生式在point 中 */int

5、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;size_t(j)=strlen(point)-1;j+)if(pointn=point0)/* 如果 |后的首符号和左部相同*/for(j=n+1;size_t(j)=strlen(point)-1;j+)while(pointj!=|&pointj!=0)tempm+=pointj+;leftcount=ch;memcpy(rightcount,temp,m);rightcountm=ch;rig

6、htcountm+1=0;m=0;count+;if(pointj=|)n=j+1;break;else/* 如果 |后的首符号和左部不同*/leftcount=ch;rightcount0=;rightcount1=0;count+;for(j=n;size_t(j)=strlen(point)-1;j+)if(pointj!=|)tempm+=pointj;elseleftcount=point0;memcpy(rightcount,temp,m);rightcountm=ch;rightcountm+1=0;printf( count=%d ,count);m=0;count+;left

7、count=point0;memcpy(rightcount,temp,m);rightcountm=ch;rightcountm+1=0;count+;m=0;/*分解不含有左递归的产生式*/void non_re(char *point)int m=0,j;char temp20;for(j=3;size_t(j)=strlen(point)-1;j+)if(pointj!=|)tempm+=pointj;elseleftcount=point0;memcpy(rightcount,temp,m);rightcountm=0;m=0;count+;leftcount=point0;memc

8、py(rightcount,temp,m);rightcountm=0;count+;m=0;/*读入一个文法*/char grammer(char *t,char *n,char *left,char right5050)char vn50,vt50;char s;char p5050;int i,j,k;printf(n 请输入文法的非终结符号串:);scanf(%s,vn);getchar();i=strlen(vn);memcpy(n,vn,i);ni=0;printf( 请输入文法的终结符号串:);scanf(%s,vt);getchar();i=strlen(vt);memcpy(

9、t,vt,i);ti=0;printf( 请输入文法的开始符号:);scanf(%c,&s);getchar();printf( 请输入文法产生式的条数:);scanf(%d,&i);getchar();for(j=1;j=i;j+)printf( 请输入文法的第%d 条(共 %d 条)产生式: ,j,i);scanf(%s,pj-1);getchar();for(j=0;j)printf(ninput error!);validity=0;return(0);/* 检测输入错误*/for(k=0;k=i-1;k+)/* 分解输入的各产生式*/if(pk3=pk0)recur(pk);elsenon_re(pk);return(s);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 演讲稿/致辞

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号