我正在阅读一个简单的计算器语言解释器。在此处发布整个代码没有任何意义。据我所知,只是相关的部分。在下面的函数中,当'SyntaxError'
大于0时引发len(tokens)
。这对我来说没有意义,因为令牌应始终具有一定的长度。第二个功能是令牌生成器功能,该功能接受输入表达式并生成令牌列表。从该示例可以看出,长度不为零。下面是一个小的词汇表-
def calc_parse(line):
"""Parse a line of calculator input and return an expression tree."""
tokens = tokenize(line)
expression_tree = analyze(tokens)
if len(tokens) > 0: #why would length of tokens be 0?
raise SyntaxError('Extra token(s): ' + ' '.join(tokens))
return expression_tree
def tokenize(line):
"""Convert a string into a list of tokens."""
spaced = line.replace('(',' ( ').replace(')',' ) ').replace(',', ' , ')
return spaced.split()
tokenize('add(2, mul(4, 6))')
#['add', '(', '2', ',', 'mul', '(', '4', ',', '6', ')', ')']
len (tokenize('add(2, mul(4, 6))'))
#11
tokenizer
-词法分析器analyze
-语法分析器其中-
首先,词法分析器将输入字符串划分为标记, 这是语言的最小语法单元,例如名称 和符号。其次,句法分析器构造一个表达式 此令牌序列中的树。
答案 0 :(得分:0)
基于DanielRoseman的评论:
使用tokenize
在analyze
函数外部对令牌列表进行了突变;之后,if条件良好。
您没有显示analyzer()的代码,但是我猜想它 改变其参数-即它从令牌中删除所有条目 分析它们,如果返回后还有剩余,则必须 语法错误。 –丹尼尔·罗斯曼