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

  • EprimeXε に一致する を呼び出します
  • Eprime常に呼び出しますEprime(呼び出された場合にスタック オーバーフローが保証されますEprime)
于 2013-03-15T17:43:12.423 に答える