
数据解析:解析数据结构与算法的源码
解析器像是个数据翻译官,把字节流变成程序能理解的结构。咱们拿JSON解析器开刀,看看它怎么
把{"age": 18}变成内存里的哈希表。先看个极简版的状态机实现:
```python
class JsonParser:
def __init__(self, s):
self.index = 0
self.str = s
def parse_value(self):
if self.current_char() == '{':
return self.parse_object()
# 处理数组、字符串等其他类型...
def parse_object(self):
obj = {}
self.eat('{')
while self.current_char() != '}':
key = self.parse_string()
self.eat(':')
value = self.parse_value()
obj[key] = value
if self.current_char() == ',':
self.eat(',')
self.eat('}')
return obj
```
这个状态机像吃豆人游戏,逐个字符吞噬输入流。`current_char()`相当于探照灯,`eat()`方法像
传送带把字符喂给解析器。注意`parse_object`里的循环结构,像极了现实中的装配流水线——遇到冒号就
切换零件组装模式。
递归下降法在真实项目中很常见,比如Python的json模块底层就有类似结构。它的优势在于调试方
便,遇到语法错误时调用栈就是天然的错误定位器。但手写解析器有个坑:处理unicode转义时容易漏掉四
字节编码的情况。看看Go语言标准库的实现: