递归下降解析器C程序

递归下降解析器C程序,c,parsing,recursive-descent,C,Parsing,Recursive Descent,我有以下语法,需要用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->EX|Y X->+E|*E Y->(E)|i E->YE` X->+E|*E Y->(E)|i E`->XE`|e e表示ε

我有以下语法,需要用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->EX|Y
X->+E|*E
Y->(E)|i
E->YE`
X->+E|*E
Y->(E)|i
E`->XE`|e 
e表示ε

现在我已经为这种语法编写了C程序,但是我遇到了一个分段错误

#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;
}
#包括
静态字符c[10];
int j=0;
int main()
{
printf(“输入字符串”);
scanf(“%s”,c);
E();
如果(c[j]='$')
printf(“有效字符串\n”);
其他的
printf(“无效字符串\n”);
返回0;
}
E()
{
Y();
eprome();
返回;
}
X()
{
如果(c[j]=='+')
{
j++;
E();
}
else如果(c[j]='*')
{
j++;
E();
}
返回;
}
Y()
{
如果(c[j]=='(')
{
j++;
E();
如果(c[j]==')')
j++;
}
else如果(c[j]=='i')
j++;
返回;
}
eprome()
{
X();
eprome();
返回;
}

在您的实现中,您将ε处理从
eprome()
移动到
X()

  • eprome()
    不允许直接使用ε
  • X()
    不允许匹配ε
当尝试将ε与
eprome
匹配时,这会导致以下序列的堆栈溢出:

  • eprome
    调用与ε匹配的
    X
  • eprome
    始终调用
    eprome
    (如果调用了
    eprome
    ,则保证堆栈溢出)

您通过什么输入接收seg故障?您确定
静态字符c[10]足够大吗?