不知道是什么导致了我的解释器(python)中的这个错误

问题描述 投票:0回答:1

在 python 中制作语言解释器,但遇到了这个错误,它只显示 2 个字符串,然后显示错误。这是为什么? 在打印所有 NUM 和 EXPR 之前它工作正常,问题似乎主要出在解析函数中。

from sys import *

tokens = []

def open_file(filename):
    data = open(filename, 'r').read()
    data += "<EOF>"
    return data

def lex(filecontents):
    tok = ""
    state = 0
    string = ""
    expr = ""
    n = ""
    isexpr = 0
    for char in filecontents:
        tok += char
        if tok == " ":
            if state == 0:
                tok = ""
            else:
                tok = " "
        elif tok == "\n" or tok =="<EOF>":
            if expr != "" and isexpr == 1:
                tokens.append("EXPR:" + expr)
                expr = ""
            elif expr != "" and isexpr == 0:
                tokens.append("NUM:" + expr)
                expr = ""
            tok = ""
        elif tok == "PRINT" or tok == "print":
            tokens.append("PRINT")
            tok = ""
        elif tok == "0" or tok == "1" or tok == "2" or tok == "3" or tok == "4" or tok == "5" or tok == "6" or tok == "7" or tok == "8" or tok == "9":
            expr += tok
            tok = ""
        elif tok == "+":
            isexpr = 1
            expr += tok
            tok = ""
        elif tok == "\"":
            if state == 0:
                state = 1
            elif state == 1:
                tokens.append("STRING:" + string + "\"")
                string = ""
                state = 0
                tok = ""
        elif state == 1:
            string += tok
            tok = ""
    #print(tokens)
    return tokens

def parse(toks):
    i = 0
    while(i < len(toks)):
        if toks[i] + " " + toks[i+1][0:6] == "PRINT STRING" or toks[i] + " " + toks[i+1][0:3] == "PRINT NUM" or toks[i] + " " + toks[i+1][0:4] == "PRINT EXPR":
            if toks[i+1][0:6] == "STRING":
                print(toks[i+1][7:])
            elif toks[i+1][0:3] == "NUM":
                print(toks[i+1][4:])
            elif toks[i+1][0:4] == "EXPR":
                print(toks[i+1][5:])
            i+= 2

def run():
    data = open_file(argv[1])
    toks = lex(data)
    parse(toks)

run()
PRINT "HELLO WORLD"
print "string"
566755664645454
5 + 6
print 55
print 5 + 8
PS C:\Users\essam\Desktop\spl> python basic.py test.lang
"HELLO WORLD"
"string"
Traceback (most recent call last):
  File "C:\Users\essam\Desktop\spl\basic.py", line 73, in <module>
    run()
  File "C:\Users\essam\Desktop\spl\basic.py", line 71, in run
    parse(toks)
  File "C:\Users\essam\Desktop\spl\basic.py", line 58, in parse
    while(i < len(toks)):
              ^^^^^^^^^
KeyboardInterrupt
PS C:\Users\essam\Desktop\spl>

我尝试更改解析函数,但我的尝试最终打印了 566755664645454 但不是 5 + 6

python interpreter
1个回答
0
投票
def parse(toks):
    i = 0
    while(i < len(toks)):
        if toks[i] + " " + toks[i+1][0:6] == "PRINT STRING" or toks[i] + " " + toks[i+1][0:3] == "PRINT NUM" or toks[i] + " " + toks[i+1][0:4] == "PRINT EXPR":
            ...
            i+= 2

如果第一个

if
条件不为真,
i
不会递增,因此
while
循环将永远运行,因为它会一遍又一遍地测试相同的条件,因为
i
没有改变。

我想也许您希望

i += 2
if
处于相同的缩进级别,而不是嵌套在其中。

© www.soinside.com 2019 - 2024. All rights reserved.