创建词法分析器

And*_*ndy 1 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
Run Code Online (Sandbox Code Playgroud)

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

Som*_*ude 5

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

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

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


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