热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python解释器实现及其嵌入式应用:1到6章总结

通过1到6部分的学习,实现了一个能进行四则运算,具有优先级,支持括号的计算器。能够满足一般计算需求的计算器。内容概要巴科斯范式表示grammar。基本知识,以及如何将优先级信息以BN

通过1到6部分的学习,实现了一个能进行四则运算,具有优先级,支持括号的计算器。能够满足一般计
算需求的计算器。

内容概要

  1. 巴科斯范式表示grammar。基本知识,以及如何将优先级信息以BNF形式表示。
  2. syntax diagram 展示识别流程。等效于BNF,BNF可以理解成文本化的syntax diagram。
  3. BNF到python代码的转换

体会

这六部分内容比较简单,基本上前一部分的练习做完后,下一部分内容就解决了大部分了。

截止目前为止,实现的这个计算器有一个bug:

host > (1+2)
3
host > (1+2))
3
host > (1+2))+3
3

也就是说当又括号数量大于左括号时,并不会检测到语法错误,相关代码实现如下。

...
elif self.current_token.type == LPAREN:
self.eat(LPAREN)
result = self.expr()
self.eat(RPAREN)
return result

这个问题应该算是BNF设计的问题,因为代码和BNF是完全对应的,从BNF中就能看到只是保证喂了足够
多的右括号而已。

提供一种代码修改方案如下:

self.paren_pairnum = 0
...
elif self.current_token.type == LPAREN:
self.eat(LPAREN)
self.paren_pairnum += 1
result = self.expr()
self.eat(RPAREN)
self.paren_pairnum -= 1
if self.paren_pairnum == 0 and self.current_token.type == RPAREN:
self.error()
return result

虽然修改代码能够解决,但是我觉得这不是一种state-of-art的解决方式,还是要从BNF的设计上去考察。


推荐阅读
author-avatar
骑单车追梦的小男孩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有