python 一遍式四则运算
#!/usr/bin/python
#coding: utf-8 INTEGER = 'INTEGER'
PLUS = '+'
MINUS = '-'
MUL = '*'
DIV = '/'
LC = '('
RC = ')'
EOF = 'EOF' class Token(object):
def __init__(self, typ, val):
self.typ = typ;
self.val = val; def __str__(self):
return "Token('{typ}','{val}')".format(typ=self.typ, val=self.val) def __repr__(self):
return self.__str__() class Lexer(object):
def __init__(self, text):
self.text = text
self.pos = 0
self.cur_token = None;
self.status = 0 def next_token(self):
if self.pos > len(self.text) -1:
return Token(EOF, '') ch = ''
while True:
ch = self.text[self.pos]
self.pos+=1 if (ch!=' ' and ch!='\t'):
break; if self.status==0:
if ch.isdigit():
self.status = 1
return Token(INTEGER, int(ch + self.next_token().val))
else:
return Token(ch, ch)
elif self.status==1:
if ch.isdigit():
return Token(INTEGER, ch + self.next_token().val)
else:
self.pos -= 1
self.status = 0
return Token(INTEGER, '') class Interpreter(object):
def __init__(self, lexer):
self.lexer = lexer
self.cur_token = lexer.next_token() def error(self):
raise Exception("syntax error") def eat(self, typ):
tok = self.cur_token
if (tok.typ == typ):
self.cur_token = self.lexer.next_token()
return tok.val
else:
self.error() def factor(self):
if (self.cur_token.typ == INTEGER):
tok = self.cur_token
self.eat(INTEGER)
return tok.val
elif self.cur_token.typ == LC:
self.eat(LC)
result = self.expr()
self.eat(RC)
return result
else:
self.error() def term(self):
result = self.factor() while self.cur_token.typ in (MUL, DIV):
if (self.cur_token.typ==MUL):
self.eat(MUL)
result = result * self.factor()
elif (self.cur_token.typ==DIV):
self.eat(DIV)
result = result / self.factor() return result def expr(self):
result = self.term() while self.cur_token.typ in (PLUS, MINUS):
if (self.cur_token.typ==PLUS):
self.eat(PLUS)
result = result + self.term()
elif (self.cur_token.typ==MINUS):
self.eat(MINUS)
result = result - self.term() return result def main():
print("expr2")
while True:
text = raw_input("calc> ")
if not text:
continue if text=="exit":
break; lex = Lexer(text)
calc = Interpreter(lex)
result = calc.expr()
print(result) if __name__ == "__main__":
main()
python 一遍式四则运算的更多相关文章
- Python 去剑式
Python 去剑式 种种变化,用以体演总诀.共有三百六十种变化. 用以破解普天下各门各派的剑法.「破剑式」虽只一式,但其中于天下各门各派剑法要义兼收并蓄:虽说「无招」却是以普天下剑法之招数为根基,因 ...
- Python实现简单的四则运算
GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...
- Python列表推导式和嵌套的列表推导式
列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我们想创建一个平方 ...
- ubuntu14.04 python + opencv 傻瓜式安装解决方案
ubuntu14.04 python + opencv 傻瓜式安装解决方案 ubuntu下使python和opencv来做开发的话,总要花那么点时间来配置环境.我偶然间发现了一种傻瓜式安装办法希望快 ...
- python的推导式 —— 列表推导式、集合和字典推导式
python的推导式是用于快速处理数据的方法. 主要有:列表推导式.集合推导式和字典推导式 import time import numpy as np 列表推导式: 1. 速度快 t1 = time ...
- python字典推导式 - python基础入门(17)
在昨天的文章中,我们介绍了关于python列表推导式 的使用,字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要写在{}内部. ...
- python 列表推导式 - python基础入门(16)
截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率更高. 一.什么是推导式 推导式是从一个或者多个 ...
- 软工第五次作业——Python效能分析之四则运算生成器
Github项目地址: https://github.com/JtvDeemo/elementary-arithmetic PSP PSP2.1 Personal Software Process S ...
- python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套
复习 1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用: # 字符串的比较# -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...
随机推荐
- Javascript调用 ActiveXObject导出excel文档。
function makeDataBook(){ var xls = new ActiveXObject ("Excel.Application"); xls.visible = ...
- 解析:DNS 原理(入门篇)
DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...
- 转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户
但凡是学过Oracle的同学,对DBCA(Database Configuration Assistant, DBCA)都不会陌生,有了这个工具,使得创建数据库成为可能.而DBCA本身有图形和静默两种 ...
- 错误 1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 C:\Users\Administ
错误 1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 C:\Users\Administ 这两个fatal error是因为从低版本的WTL到高版本的WTL转变后产生的 ...
- ubuntu12.04的NFS配置
安装nfs: #sudo apt-get install nfs-kernel-server ubuntu12.04中的已经是最新版本了,无需安装 打开/etc/exports文件,在末尾加入: /h ...
- SonarQube代码质量管理平台比较好的搭建和使用资料
http://www.voidcn.com/blog/lidujun1028/article/p-3831235.html Sonar (SonarQube)是一个开源平台,用于管理源代码的质量. ...
- js自写字符串 append 方法
function stringbuilder(){ this.arr = new Array(); this.append=function(str) { this.arr.push(str); } ...
- linux和windows之间上传 下载文件 非ftp方式
用 命令 rz 上传 sz 下载 文件夹加上 -r rz上传替换时用 -y 谁用谁知道 两台linux传 : scp -r 文件夹 username@ip:路径 (如果传输文件就 ...
- 学习笔记——抽象工厂模式Abstract Factory
在工厂模式的基础上,通过为工厂类增加接口,实现其他产品的生产,而不用一类产品就增加一个工厂. 依然以<真菌世界>游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和20毫米 ...
- ios 集合总结
NSArray 用于对象有序集合(相当于是数组) 它有两个限制: 1. 它只能存储objective-c的对象,但不能存储C中的基本数据类型,如int , float, enum, struct等. ...