2013-03-15 75 views
0

我有以下的语法和需要用C写一个递归下降解析器递归下降解析器的C程序

E->E+E|E*E|(E)|i 

我用左保理得到以下语法现在

E->EX|Y 
X->+E|*E 
Y->(E)|i 

,我消除左递归得到以下语法

E->YE` 
X->+E|*E 
Y->(E)|i 
E`->XE`|e 

e表示的ε-

此语法现在我已经写C程序,但我得到一个segmenation故障

#include<stdio.h> 
static char c[10]; 
int j=0; 
int main() 
{ 
    printf("Enter a string\n"); 
    scanf("%s",c); 
    E(); 
    if(c[j]=='$') 
     printf("Valid string\n"); 
    else 
     printf("Invalid string\n"); 
    return 0; 
} 
E() 
{ 
    Y(); 
    Eprime(); 
    return; 
} 
X() 
{ 
    if(c[j]=='+') 
    { 
     j++; 
     E(); 
    } 
    else if(c[j]=='*') 
    { 
     j++; 
     E(); 
    } 
    return; 
} 
Y() 
{ 
    if(c[j]=='(') 
    { 
     j++; 
     E(); 
     if(c[j]==')') 
      j++; 
    } 
    else if(c[j]=='i') 
     j++; 
    return; 
} 

Eprime() 
{ 
    X(); 
    Eprime(); 
    return; 
} 
+0

与*您会收到哪些输入* seg故障? – user7116 2013-03-15 17:38:13

+0

你确定'static char c [10];'够大吗? – adamdunson 2013-03-15 17:38:21

回答

2

在您的实施,移动ε处理来自Eprime()X()

  • Eprime()不允许ε直接
  • X()确实允许匹配ε

试图匹配时,这将导致以下序列的堆栈溢出ε与Eprime

  • Eprime电话X,它匹配ε
  • Eprime总是调用Eprime(保证堆栈溢出,如果Eprime是不断呼吁)