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