簡體   English   中英

用 C# 編寫的遞歸解釋器中的 StackOverflowException

[英]StackOverflowException in recursive interpreter written in C#

我正在嘗試在 C# 中創建一個簡單的解釋器。 我的想法是使用遞歸。 所以我有這個 function:

void InterpretLine(int lineIndex, string[] lines)
{
    // Do interpreter stuff

    InterpretLine(lineIndex + 1, lines);
}

如您所見,這使用遞歸。 我使用遞歸來做到這一點,因為這樣我就不必處理 function 堆棧和其他東西了。 這適用於少於 100 行的輸入代碼,但如果它達到太多行,則會引發System.StackOverflowException

有沒有比遞歸更好的方法?

您將不得不更改邏輯以不使用遞歸來讀取每一行。 如果您使用遞歸,您將為每一層遞歸添加一個新的 function 調用到堆棧中,並且在滿足退出條件之前不會刪除之前的 function 調用。 如果您將其設置為 500 次左右的深度調用,您可能會遇到 stackoverflow 異常。

現在,我沒有時間閱讀您的代碼,但我可以告訴您需要做什么:將遞歸調用變成循環。

您的代碼可能可以分解為以下內容:

void ExecuteProgramLine(int lineNumber)
{
   InterpretAndRunLine(lineNumber);
   ExecuteProgramLine(lineNumber + 1);
}

您需要將其轉換為:

for(int lineNumber = 0; lineNumber < fileLines) // (foreach loop is probably better)
{
    InterpretAndRunLine(lineNumber);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM