gpt4 book ai didi

c - 递归下降解析器C程序

转载 作者:行者123 更新时间:2023-11-30 14:20:28 26 4
gpt4 key购买 nike

我有以下语法,需要用 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,则保证堆栈溢出)

关于c - 递归下降解析器C程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com