2013-03-15 82 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是不斷呼籲)