首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个Lexer

创建一个Lexer
EN

Stack Overflow用户
提问于 2013-08-15 16:19:30
回答 2查看 795关注 0票数 1

嘿,伙计们,我在试着理解一些关于词汇者的概念。我了解到,在编译器中使用词汇将字符串中的单个字符分隔成称为记号的形式。但让我困惑的是匹配的部分。我不明白为什么我们需要将字符匹配到相应的位置。

代码语言:javascript
复制
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循环之后,我不太了解代码试图实现什么do.Why,我们必须将字符与位置匹配吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-15 16:28:07

一个非常传统的lexer可以像这样工作:

  1. 从某个地方获取一个字符,无论是文件还是缓冲区
  2. 检查当前字符是什么:
    • 是空格吗?跳过所有空白
    • 这是一个评论介绍的角色吗?获取并跳过评论
    • 是个数字吗?那就试着找个号码
    • "吗?那就试着得到一个字符串
    • 是个角色吗?然后尝试获取标识符。
      • 标识符是关键字/保留词吗?

代码语言:javascript
复制
- Otherwise, is it a valid operator sequence?

  1. 返回令牌类型

当然,您可以使用正则表达式来代替一次检查单个字符。

学习手写词汇的最佳方法是(IMO)找到简单的现有词汇者,并尝试理解他们。

票数 5
EN

Stack Overflow用户

发布于 2013-08-15 16:31:55

它不匹配“字符与位置”。"pos“参数只用于在”字符“字符串的一部分中寻找模式--从index=pos开始到结束。因此,代码试图按照给定的顺序将给定的令牌匹配到给定的字符串。在字符串中找到令牌之后,下一个令牌只匹配到字符串的其余部分。严格地说,这并不是一个雷克萨斯,因为它做的比一个雷克萨斯应该做的(参考Joachim Pileborg的答案或雷克萨斯的定义)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18257008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档