You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现Tokenizer与Parser?求开发思路及代码实现指导

别发愁,咱们一步步来实现这两个模块,先搞定Tokenizer(分词器),再处理Parser(解析器),思路其实很清晰的~

第一步:实现Tokenizer(分词器)

你的需求是把输入字符串拆分成包含括号、关键字、变量、数字的token列表,核心是要把括号单独作为独立token,同时用空格分隔其他元素。我们可以通过遍历字符串、累积字符的方式实现:

def tokenizer(s):
    tokens = []
    current_token = []
    for char in s:
        # 遇到空格时,把累积的token加入列表(如果有的话)
        if char.isspace():
            if current_token:
                tokens.append(''.join(current_token))
                current_token = []
        # 遇到括号时,先处理当前累积的token,再把括号单独加入列表
        elif char in ('(', ')'):
            if current_token:
                tokens.append(''.join(current_token))
                current_token = []
            tokens.append(char)
        # 其他字符(字母、数字、运算符)加入当前token
        else:
            current_token.append(char)
    # 处理遍历结束后剩下的最后一个token
    if current_token:
        tokens.append(''.join(current_token))
    return tokens

测试一下你给的示例输入:

test_input = "(define x 5) ( + (* 2 x) 7)"
print(tokenizer(test_input))
# 输出正好是你要的结果:['(', 'define', 'x', '5', ')', '(', '+', '(', '*', '2', 'x', ')', '7', ')']
第二步:实现Parser(解析器)

Parser需要把token列表转换成嵌套的元组结构,这本质是处理类似Lisp的S表达式,递归是最适合的方式——因为表达式本身是嵌套的。我们可以用一个索引指针跟踪处理位置,递归解析每个子表达式:

def parser(tokens):
    index = 0
    
    # 内部递归函数,处理单个表达式
    def parse_expression():
        nonlocal index
        token = tokens[index]
        
        # 遇到左括号,开始解析一个新的表达式组
        if token == '(':
            index += 1  # 跳过左括号
            expr = []
            # 一直解析到遇到右括号
            while tokens[index] != ')':
                expr.append(parse_expression())
            index += 1  # 跳过右括号
            return tuple(expr)
        # 遇到意外的右括号,抛出语法错误
        elif token == ')':
            raise SyntaxError("Unexpected ')' in input")
        # 普通token:尝试转成数字,失败则保留字符串
        else:
            try:
                value = int(token)
            except ValueError:
                value = token
            index += 1
            return value
    
    # 解析所有表达式,收集结果
    parsed_result = []
    while index < len(tokens):
        parsed_result.append(parse_expression())
    return parsed_result

测试Tokenizer输出的token列表:

test_tokens = ['(', 'define', 'x', '5', ')', '(', '+', '(', '*', '2', 'x', ')', '7', ')']
print(parser(test_tokens))
# 输出:[('define', 'x', 5), ('+', ('*', 2, 'x'), 7)]
整体测试

把两个函数结合起来,就能完成从输入字符串到最终嵌套元组的完整流程:

# 完整流程测试
input_str = "(define x 5) ( + (* 2 x) 7)"
tokens = tokenizer(input_str)
final_result = parser(tokens)
print(final_result)
# 输出:[('define', 'x', 5), ('+', ('*', 2, 'x'), 7)]

内容的提问来源于stack exchange,提问作者Eduardo Ribeiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:07:39