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进行比较 ...
随机推荐
- React和动态网站接口的经济学
来自: React and the economics of dynamic web interfaces 自从2000开始我就一直在做web开发,曾见过很多以各种库和框架的起起落落,这些库和框架作为 ...
- perl-cgi基础
来源: http://www.cnblogs.com/itech/archive/2012/09/22/2698553.html 代码: http://xxxxx/cgi/perl-cgi.cgi?n ...
- arcconf
arcconf create 1 logicaldrive max volume 0 31 noprompt 创建 Logical Drive, 这里 0 31 就是之前记录的 Channel, De ...
- Server的Transfer和Response的Redirect
在实现页面跳转的时候,有些人喜欢用Response.Redirect,而有些人则喜欢用Server.Transfer.大部分时间似乎这两种方法都可以实现相同的功能,那究竟有区别吗? 查了些文档,发现两 ...
- VS2010中安装AjaxControlToolkit
原文地址:http://www.asp.net/ajaxlibrary/act.ashx 第一步 下载Ajax Control Toolkit 进入网址http://ajaxcontroltoolki ...
- swool安装
swoole安装 安装完PHP后,即可安装swoole扩展. swoole扩展下载地址:https://github.com/swoole/swoole-src/releases 尽量选择stable ...
- Timewarp 一种生成当中帧技术,异步时间扭曲(Asynchronous Timewarp)
翻译: https://www.oculus.com/blog/asynchronous-timewarp/ 异步时间扭曲(Asynchronous Timewarp 时间扭曲,即调整时长) 关 ...
- SEO策略与细节:细节决定成败
昨天展开seo探讨会.听了一场医疗界seo大神的讲座.收益匪浅今天讲他的演讲内容整理出来与大家分享.希望对医疗界的seo带来些帮助.站长们一起成长! 一.首页 1.元标签设置 标题:上海癫痫病医院哪家 ...
- HTML5程序设计 Canvas API
检测浏览器支持情况 <script type="text/javascript"> try { document.createElement("Canvas& ...
- 平移关节(Prismatic Joint)
package{ import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.Joints ...