0

我有以下语法,需要用 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 程序,但是我遇到了分段错误

#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;
}
4

1 回答 1

2

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

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

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

  • Eprime调用X,匹配 ε
  • Eprime总是调用Eprime(保证堆栈溢出,如果Eprime曾经被调用)
于 2013-03-15T17:43:12.423 回答