创建一个Lexer

时间:2013-08-15 16:19:31

标签: python lexer

嘿伙计们,我正在努力了解有关词法分析者的一些概念。我理解在编译器中使用词法分析器将字符串中的单个字符分隔为称为标记的形式。但令我困惑的是匹配部分。我不明白为什么我们需要将字符匹配到相应的位置。

import sys
import re

def lex(characters, token_exprs):
    pos = 0
    tokens = []
    while pos < len(characters):
        match = None
        for token_expr in token_exprs:
            pattern, tag = token_expr
            regex = re.compile(pattern)
            match = regex.match(characters, pos)
            if match:
                text = match.group(0)
                if tag:
                    token = (text, tag)
                    tokens.append(token)
                break
        if not match:
            sys.stderr.write('Illegal character: %s\n' % characters[pos])
            sys.exit(1)
        else:
            pos = match.end(0)
    return tokens

这是我不完全理解的代码。在for循环之后,我不太清楚代码试图做什么。为什么我们必须将字符与位置匹配?

2 个答案:

答案 0 :(得分:3)

一个相当传统的词法分析器可以像这样工作:

  1. 从某个地方获取角色,无论是文件还是缓冲区
  2. 检查当前字符是什么:
    • 这是一个空白吗?跳过所有空格
    • 是评论介绍人物吗?获取并跳过评论
    • 是数字吗?然后尝试得到一个数字
    • "吗?然后尝试获取字符串
    • 是角色吗?然后尝试获取标识符
      • 标识符是关键字/保留字吗?
    • 否则,它是一个有效的运算符序列吗?
  3. 返回令牌类型
  4. 您可以使用正则表达式,而不是一次检查单个字符。


    了解手写词法分析器如何工作的最佳方法是(IMO)找到简单的现有词法分析器并尝试理解它们。

答案 1 :(得分:0)

它与“位置字符”不匹配。给出“pos”参数只在“字符”字符串的一部分中搜索模式 - 从index = pos到end。因此代码尝试将给定顺序的给定标记与给定字符串匹配。在字符串中找到令牌后,下一个令牌仅与字符串的剩余部分匹配。 严格来说,它不是词法分析器,因为它比词法分析者应该做的更多(参考Joachim Pileborg的回答或Lexer的definition)。