代码之家  ›  专栏  ›  技术社区  ›  pyeR_biz

简单解析器-当len(tokens)大于0时,为什么要引发“语法错误”?

  •  0
  • pyeR_biz  · 技术社区  · 8 年前

    我正在读一个简单的计算器语言解释器。在这里发布整个代码是没有意义的。就我所知,这部分是相关的。在下面的函数中,a 'SyntaxError' len(tokens) 大于0。这对我来说没有意义,因为代币应该有一定的长度。第二个函数是tokenizer函数,它接受一个输入表达式并生成一个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 -句法分析器

    其中-

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

    1 回复  |  直到 8 年前
        1
  •  0
  •   pyeR_biz    8 年前

    基于评论 DanielRoseman 以下内容:

    令牌列表在 tokenize 函数,使用 analyze ;之后,if条件良好。

    您没有显示analyze()的代码,但我猜 改变它的参数-即它从标记中删除所有条目 对它们进行分析,如果在它返回之后还有剩余的东西,那么 语法错误。丹尼尔·罗斯曼