简单的解析器-当len(令牌)大于0时,为什么会引发语法错误?

时间:2018-06-25 06:31:31

标签: python python-3.x parsing

我正在阅读一个简单的计算器语言解释器。在此处发布整个代码没有任何意义。据我所知,只是相关的部分。在下面的函数中,当'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
  • func tokenizer-词法分析器
  • func analyze-语法分析器

其中-

  

首先,词法分析器将输入字符串划分为标记,   这是语言的最小语法单元,例如名称   和符号。其次,句法分析器构造一个表达式   此令牌序列中的树。

1 个答案:

答案 0 :(得分:0)

基于DanielRoseman的评论:

使用tokenizeanalyze函数外部对令牌列表进行了突变;之后,if条件良好。

  

您没有显示analyzer()的代码,但是我猜想它   改变其参数-即它从令牌中删除所有条目   分析它们,如果返回后还有剩余,则必须   语法错误。 –丹尼尔·罗斯曼