#!/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 一遍式四则运算的更多相关文章

  1. Python 去剑式

    Python 去剑式 种种变化,用以体演总诀.共有三百六十种变化. 用以破解普天下各门各派的剑法.「破剑式」虽只一式,但其中于天下各门各派剑法要义兼收并蓄:虽说「无招」却是以普天下剑法之招数为根基,因 ...

  2. Python实现简单的四则运算

    GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...

  3. Python列表推导式和嵌套的列表推导式

    列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我们想创建一个平方 ...

  4. ubuntu14.04 python + opencv 傻瓜式安装解决方案

    ubuntu14.04  python + opencv 傻瓜式安装解决方案 ubuntu下使python和opencv来做开发的话,总要花那么点时间来配置环境.我偶然间发现了一种傻瓜式安装办法希望快 ...

  5. python的推导式 —— 列表推导式、集合和字典推导式

    python的推导式是用于快速处理数据的方法. 主要有:列表推导式.集合推导式和字典推导式 import time import numpy as np 列表推导式: 1. 速度快 t1 = time ...

  6. python字典推导式 - python基础入门(17)

    在昨天的文章中,我们介绍了关于python列表推导式 的使用,字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要写在{}内部. ...

  7. python 列表推导式 - python基础入门(16)

    截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率更高. 一.什么是推导式 推导式是从一个或者多个 ...

  8. 软工第五次作业——Python效能分析之四则运算生成器

    Github项目地址: https://github.com/JtvDeemo/elementary-arithmetic PSP PSP2.1 Personal Software Process S ...

  9. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

随机推荐

  1. Perl 之 use(), require(), do(), %INC and @INC

    来源: http://www.cnblogs.com/itech/archive/2013/03/12/2956185.html 转自:http://perl.apache.org/docs/gene ...

  2. C# 实现屏幕键盘 (ScreenKeyboard)

    原文地址:http://www.cnblogs.com/youzai/archive/2008/05/19/1202732.html 要实现一个屏幕键盘,需要监听所有键盘事件,无论窗体是否被激活.因此 ...

  3. Outing

    Outing 题目描述 Organising a group trip for the elderly can be a daunting task... Not least because of t ...

  4. PHP配置安全小技巧

  5. 火狐解决OCSP回应包含过期信息的问题

    连接 addons.mozilla.org 时发生错误. OCSP 回应包含过期信息. (错误码: sec_error_ocsp_old_response)hosts文件添加 vi /etc/host ...

  6. 破解MyEclipse2013注册码

    1.下载破解工具 http://down8.3987.com:801/2010/Myeclipse_zcj.3987.com.rar 2.打开 找到meclipse安装路径找到plugins文件夹打开 ...

  7. Swift 与 JSON 数据

    转载自: http://www.cnblogs.com/theswiftworld/p/4660177.html 我们大家平时在开发 App 的时候,相信接触最多的就是 JSON 数据了.只要你的 A ...

  8. HDU 1532 Drainage Ditches (最大网络流)

    Drainage Ditches Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) To ...

  9. World Finals 2003 UVA - 1025 A Spy in the Metro(动态规划)

    分析:时间是一个天然的序,这个题目中应该决策的只有时间和车站,使用dp[i][j]表示到达i时间,j车站在地上已经等待的最小时间,决策方式有三种,第一种:等待一秒钟转移到dp[i+1][j]的状态,代 ...

  10. vbs打包exe工具

    工具下载:http://yunpan.cn/cceRRbszUt5MC  访问密码 66e2