给定一个语法,在C中计算FIRST和FOLLOW时,如何避免堆栈溢出问题.当我不得不通过长时间的生产时,问题出现在我的代码中.
例:
S->ABCD
A->aBc | epsilon
B->Bc
C->a | epsilon
D->B
Run Code Online (Sandbox Code Playgroud)
这只是一个语法.递归是这样的:
S->A
C->A
A->B
B->D
D->aBc | epsilon
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)FIRST(S)=FIRST(A)=FIRST(B)=FIRST(D)={a,epsilon}.提供一个C(而不是C++)代码来计算和打印上面的语法的FIRST和FOLLOW集合,记住你可能会遇到一个更长的语法,它具有特定非终端的多个隐含的第一/后续集合.
例如:
FIRST(A)=FIRST(B)=FIRST(B)=FIRST(C)=FIRST(D)=FIRST(E)=FIRST(F)=FIRST(G)=FIRST(H)=FIRST(I)=FIRST(J)=FIRST(K)={k,l,epsilon}.
Run Code Online (Sandbox Code Playgroud)
那就是:让你得到
FIRST(A)你算算FIRST(B),并依此类推,直至到达FIRST(K)具有其FIRST(K)具有终端'k','l'和epsilon.暗示越长,越有可能因多次递归而遇到堆栈溢出.
如何在C语言中避免这种情况并仍能获得正确的输出?
用C(不是C++)代码解释.
char*first(int i)
{
int j,k=0,x;
char temp[500], *str;
for(j=0;grammar[i][j]!=NULL;j++)
{
if(islower(grammar[i][j][0]) || grammar[i][j][0]=='#' || grammar[i][j][0]==' ')
{
temp[k]=grammar[i][j][0];
temp[k+1]='\0';
}
else
{
if(grammar[i][j][0]==terminals[i])
{
temp[k]=' ';
temp[k+1]='\0';
}
else
{
x=hashValue(grammar[i][j][0]);
str=first(x);
strncat(temp,str,strlen(str));
}
}
k++;
}
return temp;
} …Run Code Online (Sandbox Code Playgroud) c stack-overflow compiler-construction recursion buffer-overflow