[英]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.