2013-07-23 67 views
1

我需要帮助让翻译工作。这里有'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行),并继续向下,直到它击中返回,并再次返回到它,并继续进行。

从技术上讲,在列表中以下行方式进入时,GOSUB略微跳过列表,直到它获得一个呼叫信号RETURN,然后返回到GOSUB线并再次继续向下。

主要的问题是我不知道如何做到这一点,并将其附加到一个新的列表,所以它成为一个新的对象列表,所以我可以执行它。由此产生的新名单将是:

LET A 1 
LET A 2 
LET B 3 
PRINT A 
PRINT B 
END 

我很好奇我将如何处理这个问题。我不能使用for循环,因为它会遍历整个'bumpkin'代码并解析它们。我不能跳过任何带有循环的行。

非常感谢!

编辑============================================= ==============编辑

所以,我的继承人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

这是什么语言? – 2013-07-23 01:26:59

+0

我应该在Python 3.3.2中编写一个解释器,解析你在那里看到的'bumpkin'代码。 为了澄清,'bumpkin'代码就像我的Python解释器需要处理的常规用户输入一样。 – user2559679

回答

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行执行,当你到了10 GOSUB,9推入堆栈。现在,它看起来像

Stack 
--------- 
9 
3 

开始在10行执行当你打你弹出顶部值从堆栈的回报,这是9。因此,在第9行下一回恢复执行弹出值3 ,在第3行恢复执行。

+0

该语言不相关。但我不能改变'土包子'的代码。对不起,澄清。 'bumpkin'代码实际上就是我的Python解释器必须解析的命令。用户将这些命令粘贴到文本文件中,我的解释器必须解析它们以提供输出。 – user2559679

+0

他没有改变翻车手代码,他正在描述如何实现虚拟机。 – snf

+0

对示例代码的更改只是演示了多个gosubs以及堆栈如何工作。 – dazedandconfused