词法分析:INT
约 329 字大约 1 分钟
2025-12-08
正整数
这一小节的代码量很少,我们关注整数的特点。之前我们实现的 token 只有一个字符,或者两个字符。整数由一个或多个数字组成。值得注意的是负数在这里被认为是加了 - 的正整数。负号也就是减号,作为一个独立的 token 处理在语法分析中处理。
整数的词法分析
现在我们在 TokenType 枚举类中添加一个新的类型 INT。
INT = "INT" # integer现在来看 Lexer 中的 next_token() 方法。之前,如果不能匹配,它会返回ILLEGAL 类型的 token。现在,在返回 ILLEGAL 类型的 token 之前,会先检查当前字符是否是数字,也就是从第一个 [0-9] 的字符开始,然后用 read_number() 一直扫描到数字字符串结束。然后将整个字符串返回成 INT 类型的 token。
case _:
if self.cur_char.isdigit():
tok = Token(TokenType.INT, self.read_number())
return tok
else:
tok = Token(TokenType.ILLEGAL, self.cur_char)来到 read_number() 方法。其中的 while 循环会一直扫描到数字字符串结束。
def read_number(self) -> str:
pos = self.pos
while self.cur_char.isdigit(): # stop when cur_char is not a digit
self.read_char()
return self.src_code[pos : self.pos]测试
现在我们在 REPL 中看看效果:
=>> 123 + 145
>> 3
>>
Token(type=TokenType.INT, literal='123')
Token(type=TokenType.WHITESPACE, literal=' ')
Token(type=TokenType.PLUS, literal='+')
Token(type=TokenType.WHITESPACE, literal=' ')
Token(type=TokenType.INT, literal='145')
Token(type=TokenType.NEWLINE, literal='\n')
Token(type=TokenType.INT, literal='3')
Token(type=TokenType.EOF, literal='')