如何用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
相关产品推荐
相关产品推荐

