
1. 解释器基础:词法分析与语法分析
在构建一个语言解释器时,通常会经历两个主要阶段:
- 词法分析(Lexing/Tokenization):此阶段将源代码分解成一系列有意义的单元,称为“令牌(Tokens)”。例如,print "hello" 会被分解为 PRINT 令牌和 STRING:"hello" 令牌。在提供的代码中,lex 函数负责此任务。
- 语法分析(Parsing):此阶段接收词法分析器生成的令牌流,并根据语言的语法规则构建一个抽象语法树(AST)或直接执行相应的操作。在提供的代码中,parse 函数负责处理令牌并执行打印操作。
2. 问题分析:解析器中的无限循环
根据错误报告,程序在处理完前两个字符串后,抛出了 KeyboardInterrupt 异常,这通常是由于程序进入了无限循环,用户不得不手动终止它。错误堆栈指向了 parse 函数中的 while(i
让我们仔细分析原始 parse 函数的代码片段:
def parse(toks):
i = 0
while(i < len(toks)):
# 只有当满足特定条件时,i 才会递增
if toks[i] + " " + toks[i+1][0:6] == "PRINT STRING" or \
toks[i] + " " + toks[i+1][0:3] == "PRINT NUM" or \
toks[i] + " " + toks[i+1][0:4









