综合执法局职能:Python:160行代码写一个编辑器和解释器 - Python编程 - ItEye新闻
来源:百度文库 编辑:中财网 时间:2024/05/11 16:32:12
评论(7) 有5421人浏览 python
声明:ItEye新闻文章的版权属于ItEye网站所有,严禁任何网站转载本文,否则必将追究法律责任!
< = hunters.length - 1 ? hunter_id = 0 : hunter_id++; $('hunters').update(hunters[hunter_id]);return false;" href="http://www.iteye.com/news/2677#">> 猎头职位: 北京: JavaEye招聘Ruby工程师 M. Taylor写道:我在几周前开始学习Python,作为一个学习用的项目,我给自己设定的目标是编写一个简单的while语句的编辑器和解释器。写Python代码如同梦幻,工作流程如下:思考你如何解决这个问题,尝试用最高级别eval loop去解决,如果不能完成,找另外的途径,如果可行,把它放入你的模块。终于我成功了!我用最简单的方式来写python:
Python代码
- stmtlist := (statement)*
- statement := 'if' condition stmtlist ['else' stmtlist] 'endif'
- | 'while' condition stmtlist 'endwhile'
- | label '=' expression
- | 'print' expression
- condition := expression ('=='|'!=') expression
- expression := term ('+'|'-' term)*
- term := label|digit
stmtlist := (statement)*statement := 'if' condition stmtlist ['else' stmtlist] 'endif'| 'while' condition stmtlist 'endwhile'| label '=' expression| 'print' expressioncondition := expression ('=='|'!=') expressionexpression := term ('+'|'-' term)*term := label|digit
下面是全部代码:
Python代码
- #****************** Lexer ************************
- tokenlist = []
- currtoken = ("", "", 0)
- keywords = set(["while", "endwhile", "if", "else", "endif", "print", "=", "==", "!=", "+", "-"])
- symboltable = dict()
- def nextToken():
- global currtoken, symboltable
- if(len(tokenlist) > 0):
- s = tokenlist.pop(0)
- if s in keywords:
- currtoken = (s, "", 0)
- elif s.isdigit():
- currtoken = ("digit", "", int(s))
- elif s.isalnum():
- symboltable[s] = 0
- currtoken = ("label", s, 0)
- else:
- print "syntax error: " + s
- else:
- currtoken = ("", "", 0)
- def consume(expected):
- if currtoken[0] == expected:
- nextToken()
- else:
- print "expected " + expected + " not found"
- #****************** Parser ************************
- def parseFile(filename):
- inputfile = open(filename, "r")
- inputstring = inputfile.read()
- global tokenlist
- tokenlist = inputstring.split()
- nextToken()
- return doStatementList()
- def doStatementList():
- stmts = []
- newstmt = []
- while currtoken[0] in ["while", "if", "print", "label"]:
- if currtoken[0] == "while":
- # ["while", [condition], [statementlist]]
- consume("while")
- newstmt = ["while"]
- newstmt.append(doCondition())
- newstmt.append(doStatementList())
- consume("endwhile")
- elif currtoken[0] == "if":
- # ["if", [condition], [then part], [else part]]
- consume("if")
- newstmt = ["if"]
- newstmt.append(doCondition())
- newstmt.append(doStatementList())
- if currtoken[0] == "else":
- consume("else")
- newstmt.append(doStatementList())
- consume("endif")
- elif currtoken[0] == "print":
- # ["print", [expression]]
- consume("print")
- newstmt = ["print"]
- newstmt.append(doExpression())
- elif currtoken[0] == "label":
- # ["=", [expression], [expression]]
- label = [currtoken[1]]
- nextToken()
- consume("=")
- newstmt = ["="]
- newstmt.append(label)
- newstmt.append(doExpression())
- else:
- print "invalid statement: " + currtoken[0]
- stmts.append(newstmt)
- return stmts
- def doCondition():
- exp = doExpression()
- # ["==|!=", [left side], [right side]]
- if currtoken[0] in ["==", "!="]:
- retval = [currtoken[0]]
- retval.append(exp)
- nextToken()
- retval.append(doExpression())
- else:
- print "expected == or != not found"
- return retval
- def doExpression():
- term = doTerm()
- # carry the term in case there's no +|-
- exp = term
- # ["+|-", [left side], [right side]]
- while currtoken[0] in ["+", "-"]:
- exp = [currtoken[0]]
- nextToken()
- exp.append(term)
- exp.append(doExpression())
- return exp
- def doTerm():
- if currtoken[0] == "label":
- retval = currtoken[1]
- nextToken()
- elif currtoken[0] == "digit":
- retval = currtoken[2]
- nextToken()
- return [retval]
- #****************** Interpreter ************************
- stack = []
- def execStatementList(pgm):
- for stmt in pgm:
- execStatement(stmt)
- def execStatement(stmt):
- if stmt[0] == "while":
- execCondition(stmt[1])
- while stack.pop():
- execStatementList(stmt[2])
- execCondition(stmt[1])
- elif stmt[0] == "if":
- execCondition(stmt[1])
- if stack.pop():
- execStatementList(stmt[2])
- elif len(stmt) == 4:
- execStatementList(stmt[3])
- elif stmt[0] == "=":
- execExpression(stmt[2])
- symboltable[stmt[1][0]] = stack.pop()
- elif stmt[0] == "print":
- execExpression(stmt[1])
- print "output:" + str(stack.pop())
- else:
- print "invalid statement"
- def execCondition(cond):
- execExpression(cond[1])
- execExpression(cond[2])
- if cond[0] == "==":
- stack.append(stack.pop() == stack.pop())
- elif cond[0] == "!=":
- stack.append(stack.pop() != stack.pop())
- def execExpression(exp):
- if len(exp) == 3:
- execExpression(exp[1])
- execExpression(exp[2])
- if exp[0] == "+":
- stack.append(stack.pop() + stack.pop())
- else:
- stack.append(stack.pop() - stack.pop())
- else:
- if type(exp[0]) == int:
- stack.append(exp[0])
- else:
- stack.append(symboltable[exp[0]])
用什么编辑器写ASP代码
想要一个代码简单的HTML在线编辑器,哪里有?
HTML编辑器和HTML代码是怎么回事啊1
谁能帮我写一个代码
诚求 编辑器代码
急~~~谁能帮我用VB写一个文档编辑器
求一个学习Python的好网站~!
请问用二进制编辑器打开一个文件之后二进制编辑器中显示的代码分别都是表示文件的什么的?
Python 语法问题:怎么实现以下 C 代码?
python,anaconda和boa constrictor的区别?
求一段去掉中文和日期的asp代码,高手帮忙写一个
求一段去掉中文和日期的asp代码,高手帮忙写一个
用汇编和c 写能在裸机上显示一个字符的代码
求好点的ubb代码编辑器
跪求~html代码编辑器~
怎么写一个网页自动弹出式代码
请推荐一个汇编语言编辑器 和下载地址
求一个反恐作弊器和地图编辑器
请问编写jsp网页除了记事本外还有没有别的编辑器,因为要重复写相同的代码很麻烦
python是一个什么程序,对系统有何影响?
求一个音乐 编辑器
寻找一个音乐编辑器
我要做一个用户注册和登陆的页面,具体的代码应该怎么写?啊
如何写一个安全性非常全面的软件注册程序!编程思想就行 无需代码