python解释器实现及其嵌入式应用:1到6章总结
2017-02-20 15:06
471 查看
通过1到6部分的学习,实现了一个能进行四则运算,具有优先级,支持括号的计算器。能够满足一般计
算需求的计算器。
syntax diagram 展示识别流程。等效于BNF,BNF可以理解成文本化的syntax diagram。
BNF到python代码的转换
截止目前为止,实现的这个计算器有一个bug:
也就是说当又括号数量大于左括号时,并不会检测到语法错误,相关代码实现如下。
这个问题应该算是BNF设计的问题,因为代码和BNF是完全对应的,从BNF中就能看到只是保证喂了足够
多的右括号而已。
提供一种代码修改方案如下:
虽然修改代码能够解决,但是我觉得这不是一种state-of-art的解决方式,还是要从BNF的设计上去考察。
算需求的计算器。
内容概要
巴科斯范式表示grammar。基本知识,以及如何将优先级信息以BNF形式表示。syntax diagram 展示识别流程。等效于BNF,BNF可以理解成文本化的syntax diagram。
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的设计上去考察。
相关文章推荐
- python解释器实现及其嵌入式应用:内部模块定义及扩展
- python解释器实现及其嵌入式应用:7到11章总结
- python解释器实现及其嵌入式应用:认识Micro Python
- python解释器实现及其嵌入式应用:Let's Build a Simple Interpreter(part12)
- python解释器实现及其嵌入式应用:专栏介绍
- python解释器实现及其嵌入式应用:一个四则运算计算器的实现
- python解释器实现以及嵌入式应用:符号表以及语法检查
- python解释器实现及其嵌入式应用:抽象语法树
- python解释器实现及其嵌入式应用:实现语法支持
- 实验4:栈和队列的基本操作实现及其应用——进制转换以及实验总结
- python解释器实现及其嵌入式应用:解释器移植
- Visual C++中窗口子类化技术的实现及其应用
- 模糊聚类算法(FCM)和硬聚类算法(HCM)的VB6.0实现及其应用
- 嵌入式实时操作系统TRON及其应用综述
- 一种变进制数及其应用(全排列之Hash实现)
- HZHOST实现自定义FSO权限的方法及其应用
- 告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- 算法总结系列之八:复读机的故事-散列表及其在.NET中的应用浅析(上集)