1

嘿伙计们,我正在尝试了解有关词法分析器的一些概念。我知道词法分析器在编译器中用于将字符串中的单个字符分隔成称为标记的形式。但让我感到困惑的是匹配部分。我不明白为什么我们需要将字符匹配到相应位置的逻辑。

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循环之后,我不太明白代码要做什么。为什么我们必须将字符与位置匹配?

4

2 回答 2

5

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

  1. 从某个地方获取一个字符,无论是文件还是缓冲区
  2. 检查当前字符是什么:
    • 是空格吗?跳过所有空格
    • 是评论介绍人物吗?获取并跳过评论
    • 是数字吗?然后尝试获取一个数字
    • "吗?然后尝试获取一个字符串
    • 是人物吗?然后尝试获取标识符
      • 标识符是关键字/保留词吗?
    • 否则,它是一个有效的运算符序列吗?
  3. 返回令牌类型

您当然可以使用正则表达式,而不是一次检查单个字符。


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

于 2013-08-15T16:28:07.063 回答
0

它与“字符与位置”不匹配。给出“pos”参数以仅在“characters”字符串的一部分中寻找模式 - 从 index=pos 开始到结束。因此,代码尝试将给定顺序中的给定标记与给定字符串匹配。在字符串中找到标记后,下一个标记仅与字符串的剩余部分匹配。严格来说,它不是词法分析器,因为它比词法分析器应该做的更多(请参阅 Joachim Pileborg 的回答或 Lexer 的定义)。

于 2013-08-15T16:31:55.990 回答