创建一个Lex

2024-04-24 23:47:13 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们,我想了解一些关于lexers的概念。我知道编译器中使用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循环之后,我不太理解代码试图做什么是的。为什么我们要把角色和位置匹配吗?在


Tags: posimportretokenforiftagmatch
2条回答

与“位置不匹配”。指定“pos”参数是为了只在“characters”字符串的一部分中搜索模式-从index=pos开始到结束。因此,代码尝试按照给定的顺序将给定的标记与给定的字符串匹配。在字符串中找到标记后,下一个标记只与字符串的其余部分匹配。 严格地说,这并不是一个lexer,因为它做的比lexer应该做的要多一些(参考joachimpileborg的回答或lexer的definition)。在

一个相当传统的lexer可以这样工作:

  1. 从某处获取一个字符,不管是文件还是缓冲区
  2. 检查当前字符:
    • 是空白吗?跳过所有空白
    • 是评论介绍角色吗?获取并跳过评论
    • 是数字吗?然后试着得到一个号码
    • 它是一个"?然后试着弄一根绳子
    • 是个角色吗?然后尝试获取标识符
      • 标识符是关键字/保留字吗?在
    • 否则,它是有效的运算符序列吗?在
  3. 返回令牌类型

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


学习手写lexer如何工作的最好方法是(IMO)找到现有的简单lexer并尝试理解它们。在

相关问题 更多 >