【问题标题】:Recursive descent parser C program递归下降解析器C程序
【发布时间】:2013-03-15 17:35:57
【问题描述】:

我有以下语法,需要用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;
}

【问题讨论】:

  • 使用 what input 您会收到该段错误吗?
  • 你确定static char c[10];足够大吗?

标签: c parsing recursive-descent


【解决方案1】:

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

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

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

  • Eprime 调用 X,匹配 ε
  • Eprime 总是调用Eprime(如果Eprime 被调用,保证堆栈溢出)

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多