需要帮助重新排列列表

时间:2013-07-23 00:55:40

标签: list

我需要帮助才能让翻译工作。我把这个'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

1 个答案:

答案 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>