命令没有在我做的翻译工作

时间:2016-05-18 14:41:26

标签: python command interpreter

(请耐心等待,我的代码非常草率,可能有点难以理解,主要是因为所有变量,global和if语句......)

我已经创建了一个解释性的,深奥的,基于磁带的编程语言,专为名为Tellurium的代码高尔夫设计(它是一个元素fyi)。到目前为止,除了条件语句之外,它的工作还不错。

这是条件语句的语法:

(integer[code]

这是Python的等价物:

if tape[selectedCell] == integer: code

所以,我的问题是你只能在代码中使用一次语句。多次使用它,它不起作用。它甚至不会抛出错误。它什么都不做。

以下是一些不起作用的命令示例,以及它们应该输出的内容。

(0[^](1[^]+(1[^]应该输出0后跟1.相反,输出 0.我认为它与第一个 (1[^]有关,由于所选单元格的值不是1,所以应该由解释器跳过。

这是另一个例子:+++++(0[^](5[^]。单元格的值增加到5.然后,(0[^]检查单元格的值是否等于零。嗯,它不是,所以应该跳过它。接下来,(5[^]检查单元格的值是否等于5。它是应该输出5。相反,它输出5\n5

又一个例子:(0[^](1[^](0[^]。解释器应该完全忽略(1[^]指令,因为单元格的值不是1.它仍然为零。因此,所需的输出应为0\n0,因为有两个0[^]命令。

(0[^]完美无缺。它输出单元格的值,即0。

我认为问题与应该跳过的语句有关,例如示例2中的(1[^]

我不知道为什么这不起作用,我已经尝试过了。我很感激一些帮助,我真的很想让这种语言重新开始!

所以,这里的解释器没有所有额外的命令。

tape = [0] * 25500
readingNum = False
readingIf = False
num = []
code = []
selectedCell = 0

def prompt():
    userInput = input("> ")
    return userInput

def read(cmd):
    length = len(cmd)
    commands = list(cmd)
    for i in range(0, length):
        parse(commands[i])

def parse(cmd):
    global tape
    global readingNum
    global readingIf
    global num
    global code
    global selectedCell

    if readingNum == True:
        if cmd == "[":
            readingNum = False
            readingIf = True

        else:               
            num.append(cmd)

    elif readingIf == True:
        if cmd == "]":
            readingIf = False
            if tape[selectedCell] == int(''.join(num)):
                read(code)
                code = []
                num = []

            else:
                return

        else:
            code.append(cmd)

    elif cmd == "^":
        print(tape[selectedCell])

    elif cmd == "+":
        tape[selectedCell] += 1

    elif cmd == "(":
        readingNum = True

    else:
        print("Error")

while 1:
    read(prompt())

1 个答案:

答案 0 :(得分:1)

这不起作用,因为你正在使用全局变量。当你点击if tape[selectedCell] == int(''.join(num)):获取第三个if语句时,nums包含['1', '1']因为两个if语句都添加了1到num,所以当你执行int(''.join(num))时最终11不等于1

您需要重构此代码以停止使用全局变量。有关如何不使用全局变量来表示堆栈的工作示例,请查看esolang I wrote a couple months back。它没有像我想的那样完成,但它有一个没有全局变量的工作堆栈。