繁体   English   中英

递归下降解析器C程序

[英]Recursive descent parser C program

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM