小编hen*_*rir的帖子

在C中处理长递归生成时如何防止堆栈溢出?

给定一个语法,在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)
FIRST(S)=FIRST(A)=FIRST(B)=FIRST(D)={a,epsilon}.  
Run Code Online (Sandbox Code Playgroud)

提供一个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

1
推荐指数
1
解决办法
237
查看次数