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进行比较 ...
随机推荐
- 最大独立集 HDU 1068
题目大意:有n个人,两个人之间有相互的关系,问最大的关系数目. 思路:n-(最大匹配数/2).因为这里给出的是n个人之间的两两关系 //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心 ...
- mynotebook
www.linux.org/threads/beats-audio-on-linux.4443/ askubuntu.com/questions/303775/envy-15-beats-audio- ...
- Exams
Exams time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...
- CentOS 下配置CUPS
一.共享打印机的设置 1.在http://www.openprinting.org/printer/HP/HP-LaserJet_1010检查打印机的支持情况,两个企鹅以上表示Mostly,支持大部分 ...
- PHP上传图片三个步骤详细分析
学习PHP时,你可能会遇到PHP上传图片问题,这里将介绍PHP上传图片问题的解决方法,在这里拿出来和大家分享一下.今天我们就开始一起学习PHP上传图片.上传图片原理:首先判断文件类型是否为图片格式,若 ...
- Learning Java 8 Syntax (Java in a Nutshell 6th)
Java is using Unicode set Java is case sensitive Comments, C/C++ style abstract, const, final, int, ...
- 下拉刷新和上拉加载 Swift
转载自:http://iyiming.me/blog/2015/07/05/custom-refresh-and-loading/ 关于下拉刷新和上拉加载,项目中一直使用MJRefresh(原先还用过 ...
- webstrom自定义代码块的设置方法
webstrom里面的自定义代码块叫做活动模版 在文件 -> 设置 -> 编辑器 -> 活动模版可以打开 里面的$var$ 代表一个变量 两个相同的$var$在不全后可以同时修改, ...
- Python -- OOP高级 -- 定制类
__str__ 和 __repr__ :实例对象直接显示字符串 class Student: def __init__(self, name): self.name = name def __str_ ...
- IDL 计算TVDI
介绍请看:http://blog.sina.com.cn/s/blog_764b1e9d0100wdrr.html 源码: IDL 源码PRO TVDI,NDVI,LST,NBINS,RES RES ...