读了《Let's Build a Compiler》前三章,对词法解析工作有一些自己粗浅的认识:
{{
单纯的词法解析,当然离不开文法描述,比如BNF范式描述之类的。
但是落实到代码实现层面,都有一个比较类似的模式描述这些
解析过程:
[吃着碗里的,瞧着锅里的。吃完碗里的,立即从锅里捞一碗,再吃着碗里的,瞧着锅里的]
在流的例子中,“瞧着锅里的”这个动作是由标准库代劳的,如果要解析字符串,那么这个动作就需要自己搞定了,不过也不困难。
比如:
char Look; // 这就是个碗
GetChar(); // 这个就用来从锅里捞一碗到碗里
只要碗里的吃完了,立即从锅里捞一碗,即任何时候Look利用完后,一定要带上一句GetChar()调用。
忽略空白字符的功能,需要调用SkipWhite()函数,该函数检测Look是否为空白字符,是的话,则根据上一条规则,利用完Look了从锅里捞一碗,即调用GetChar(),再检测,如此往复,直到Look不为空白字符时停止。即每捞一碗都保证碗里的不是老鼠屎。
}}
为了验证这个总结的正确性有效性,尝试用这个思路写了个XML解析器,很快就搞定了,当然我没写查询接口。以前没写过这种解析器,总还感觉挺复杂的,实际动手一写,发现也就那么回事。这个xml解析器自动忽略掉了xml声明部分、文档验证部分。支持的部分能够满足平时工作中碰到的大部分xml解析的场合。
===============================================
json也能照这个法子给搞定喽。