存储文法的数据结构
1 typedef struct P{ 2 char key; // 产生式左部 3 char * value [16]; // 产生式右部 4 int count; // 几组规则 5 }P; 6 typedef struct G{ 7 char * vn ; // 非终结符集合 8 char * vt ; // 终结符集合 9 P p[16]; // 产生式 10 char start; // 开始符号 11 int pcount ; 12 }G;
文法G由多条产生式组成,出现在产生式左部的非终结符,会指向一个P文法数组,每一个数组元素对应一个程式的右部,这样的结构显然是对文法进行了压缩的
算法过程
1、 扫描文法,先将间接做递归转换成直接左递归
2、 借助如下公式,消除直接左递归
对形如这样的程式
A->Aα1|Aα2|Aα3| Aαn|..|ρ1|ρ2|….| ρn
转换成如下形式
A->ρ1A'|ρ2A'|ρ3A'
A'->α1A'|α2A'|....|ε
输入
1 3 2 2 S Qc|c 3 2 Q Rb|b 4 2 R Sa|a
完整算法
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <string.h> 4 5 typedef struct P{ 6 char key; // 产生式左部 7 char * value [16]; // 产生式右部 8 int count; // 几组规则 9 }P; 10 typedef struct G{ 11 char * vn ; // 非终结符集合 12 char * vt ; // 终结符集合 13 P p[16]; // 产生式 14 char start; // 开始符号 15 int pcount ; 16 }G; 17 18 int main(){ 19 int i,n; 20 freopen("xczdg.in","r",stdin); 21 printf("Plese input P count :"); 22 scanf("%d",&n); 23 printf(" "); 24 G g; 25 g.pcount = n; 26 //g.p = (P *)malloc(sizeof(P)*n); 27 for(i=0;i<n;i++){ 28 scanf("%d%*c",&g.p[i].count); 29 g.p[i].key = getchar(); 30 getchar(); 31 char ch,str[255]; 32 int sp = 0,c=0; 33 while((ch = getchar()) != ' '){ 34 if('|' == ch){ 35 str[sp]='