我需要帮助才能让翻译工作。我把这个'bumpkin'代码作为列表就在这里。
LET A 1
GOSUB 6 <------ goes to line 6 of 'bumpkin' code (index starts at 1).
PRINT A
PRINT B
END
LET A 2
LET B 3
RETURN <------- returns to GOSUB 6 and continues on down list
从技术上讲,GOSUB的作用是它到达指定的行(在本例中为第6行)并继续向下,直到它到达RETURN并再次返回到它并继续。
技术上,在列表中以向下的方式进行时,GOSUB略微跳过列表,直到它获得一个呼叫信号RETURN,然后返回到GOSUB线并再次继续向下。
主要问题是我不知道如何执行此操作并将其附加到新列表中,因此它成为新的对象列表,因此我可以执行它。生成的新列表将是:
LET A 1
LET A 2
LET B 3
PRINT A
PRINT B
END
我很好奇我将如何处理这个问题。我不能使用for循环,因为它将循环遍历整个'bumpkin'代码并解析它们。我不能用循环跳过任何行。
非常感谢!
EDIT ============================================== ============= EDIT
到目前为止,这是我的Python代码:
oldlist = [['LET', 'A', '1'],
['GOSUB', '6'],
['PRINT', 'A'],
['PRINT', 'B'],
['END'],
['LET', 'A', '2'],
['LET', 'B', '3'],
['RETURN'],
['.']]
newlist = []
def NewLister():
ProgramCounter = 0
funcbool = True
while funcbool:
if oldlist[ProgramCounter][0] == 'LET':
newlist.append(oldlist[ProgramCounter])
ProgramCounter += 1
print(newlist)
elif oldlist[ProgramCounter][0] == 'GOSUB':
pass # <---------------------No Idea how to get this working
elif oldlist[ProgramCounter][0] == 'PRINT':
pass
elif oldlist[ProgramCounter][0] == 'END':
pass
答案 0 :(得分:2)
我认为这是一项学术练习,而且语言不相关,所以我要谈的是概念而不是代码。
您需要实现堆栈。您将项目推入堆栈并将其从堆栈中弹出。当您点击GOSUB时,请按#行继续执行。当你点击RETURN弹出堆栈的最高值并继续执行该行。
考虑这个稍微改动的代码版本......
LET A 1
GOSUB 6 <------ goes to line 6 of 'bumpkin' code (index starts at 1).
PRINT A
PRINT B
END
LET A 2
LET B 3
GOSUB 10
RETURN
DO SOMETHING
RETURN
当你击中第一个GOSUB时,你将3推入堆栈。现在看起来像
Stack
---------
3
在第6行开始执行,当你点击GOSUB 10时,将9推入堆栈。现在看起来像
Stack
---------
9
3
从第10行开始执行。当你点击返回时,你会从堆栈中弹出最高值,即9。所以在第9行继续执行。下一个返回弹出值3,在第3行继续执行。 / p>