c语言语法分析器

上传人:tang****xu1 文档编号:132721231 上传时间:2020-05-19 格式:DOC 页数:18 大小:57.50KB
返回 下载 相关 举报
c语言语法分析器_第1页
第1页 / 共18页
c语言语法分析器_第2页
第2页 / 共18页
c语言语法分析器_第3页
第3页 / 共18页
c语言语法分析器_第4页
第4页 / 共18页
c语言语法分析器_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《c语言语法分析器》由会员分享,可在线阅读,更多相关《c语言语法分析器(18页珍藏版)》请在金锄头文库上搜索。

1、#include#include#include/*/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集合*/c

2、har select5050; /*各单个产生式的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; /*求FOLLOW集合时使用*/

3、*判断一个字符是否在指定字符串中*/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); /*若不在,返回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 tem

4、p20,ch;ch=c(); /*得到一个非终结符*/k=strlen(non_ter);non_terk=ch;non_terk+1=0;for(j=0;j=strlen(point)-1;j+) if(pointn=point0) /*如果|后的首符号和左部相同*/ for(j=n+1;j=strlen(point)-1;j+) while(pointj!=|&pointj!=0) tempm+=pointj+; leftcount=ch; memcpy(rightcount,temp,m); rightcountm=ch; rightcountm+1=0; m=0; count+; if

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

6、mcpy(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;j=strlen(point)-1;j+) if(pointj!=|) tempm+=pointj;else leftcount=point0; memcpy(rightcount,temp,m); rightcountm=0; m=0; count+; leftcount=point0; memcpy(rightc

7、ount,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(请输入文法的非终结符号串:); scanf(%s,vn);getchar(); i=strlen(vn); memcpy(n,vn,i);ni=0;printf(请输入文法的终结符号串:); scanf(%s,vt);getchar(); i=strlen(vt); memcpy(t,vt

8、,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);else

9、 non_re(pk);return(s);/*将单个符号或符号串并入另一符号串*/void merge(char *d,char *s,int type) /*d是目标符号串,s是源串,type1,源串中的 一并并入目串; type2,源串中的 不并入目串*/ int i,j;for(i=0;i=strlen(s)-1;i+) if(type=2&si=) ;else for(j=0;j+) if(jstrlen(d)&si=dj) break; if(j=strlen(d) dj=si; dj+1=0; break; /*求所有能直接推出的符号*/void emp(char c) /*即求所有由

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 商业计划书

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