我正在尝试实现一个解析函数。 "从中缀的标记流和当前索引到标记流中,构造并返回树,作为节点的集合,表示表达式"这就是我到目前为止所提出的:
def parse(tokens, i = 0):
lst = []
token = lst[i]
left, i = parse(lst, i+1)
right, i = parse(lst, i+1)
if token.isdigit():
return mkLiteralNode(token)
elif token.isidentifier():
return mkVariableNode(token)
else:
left, i = parse(lst, i+1)
right, i = parse(lst, i+1)
return True
因此,通常,token.isdigit
表示此命令必须返回一个整数,mkLiteralNode
,token.isidentifier
应返回变量,或mkVariableNode
。我在测试此函数时遇到错误,错误是:
token = lst[i]
TypeError: 'int' object is not subscriptable
我该如何解决这个问题?
答案 0 :(得分:0)
错误在上一行中是正确的:
lst = 0
您正在使lst
成为int
,然后尝试将其作为一个列表来访问它,从而引发您所看到的错误。 token = lst[i]
可能应该是:
token = tokens[i]
答案 1 :(得分:0)
很抱歉给您带来不便,但我研究并找到了解决此问题的另一种方法:
def parse(tokens):
tok = next(tokens)
if tok.isdigit():
return ('literal', tok)
elif tok == "+":
return ('add', parse(tokens), parse(tokens))
elif tok == '-':
return ('subtract', parse(tokens), parse(tokens))
elif tok == "*":
return ('multiply', parse(tokens), parse(tokens))
elif tok == "//":
return ('divide', parse(tokens), parse(tokens))
else:
return ('variable', tok)