递归下降解析器C程序

时间:2013-03-15 17:35:58

标签: 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表示epsilon

现在我已经为这个语法编写了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;
}

1 个答案:

答案 0 :(得分:2)

在您的实施中,您将ε处理从Eprime()移至X()

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

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

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