关于词法方面解析的一些实践

读了《Let's Build a Compiler》前三章,对词法解析工作有一些自己粗浅的认识:

{{

单纯的词法解析,当然离不开文法描述,比如BNF范式描述之类的。

但是落实到代码实现层面,都有一个比较类似的模式描述这些 解析过程

[吃着碗里的,瞧着锅里的。吃完碗里的,立即从锅里捞一碗,再吃着碗里的,瞧着锅里的]
在流的例子中,“瞧着锅里的”这个动作是由标准库代劳的,如果要解析字符串,那么这个动作就需要自己搞定了,不过也不困难。


比如:
char Look; // 这就是个碗
GetChar(); // 这个就用来从锅里捞一碗到碗里
其他所有的解析函数,都是解析Look这个碗里的内容,并据此作出决定是否要从锅里捞一碗。
只要碗里的吃完了,立即从锅里捞一碗,即任何时候Look利用完后,一定要带上一句GetChar()调用。

忽略空白字符的功能,需要调用SkipWhite()函数,该函数检测Look是否为空白字符,是的话,则根据上一条规则,利用完Look了从锅里捞一碗,即调用GetChar(),再检测,如此往复,直到Look不为空白字符时停止。即每捞一碗都保证碗里的不是老鼠屎。

}}

为了验证这个总结的正确性有效性,尝试用这个思路写了个XML解析器,很快就搞定了,当然我没写查询接口。以前没写过这种解析器,总还感觉挺复杂的,实际动手一写,发现也就那么回事。这个xml解析器自动忽略掉了xml声明部分、文档验证部分。支持的部分能够满足平时工作中碰到的大部分xml解析的场合。

===============================================

json也能照这个法子给搞定喽。

转载于:https://my.oschina.net/zhoubaojing/blog/181256

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值