給定一個語法,當計算C中的FIRST和FOLLOW集時,如何避免堆棧溢出問題。當我不得不通過長期生產遞歸時,問題出現在我的代碼中。如何在處理C中的長遞歸生成時防止堆棧溢出?
實施例:
S->ABCD
A->aBc | epsilon
B->Bc
C->a | epsilon
D->B
這僅僅是一個語法截止頭。遞歸是這樣的:
S->A
C->A
A->B
B->D
D->aBc | epsilon
FIRST(S)=FIRST(A)=FIRST(B)=FIRST(D)={a,epsilon}.
提供一個C(不是C++)代碼,計算並打印FIRST,並按照上文牢記語法,你可能會遇到有較長的語法一個特定的非終端的多個隱含的第一/後續集合。
例如:
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}.
那就是:你獲得
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;
}
我的代碼去堆棧溢出。我怎樣才能避免它?
這清楚地解釋了算法。我很想在C中看到一個示例代碼。代碼將解決所有問題。 – K1b1w077
我很確定答案是這樣寫的,以幫助你學習和解決問題,因爲這似乎是一個班級任務。編寫解決方案不會實現這一目標。 –