标签:结构图 except ima init nta ace val none 结果
代码:
INTEGER,PLUS,MINUS,MUL,DIV,LPAREN,RPAREN,EOF=(
‘INTEGER‘,‘PLUS‘,‘MINUS‘,‘MUL‘,‘DIV‘,‘LPAREN‘,‘RPAREN‘,‘EOF‘)
class Token(object):
	def  __init__(self,type,value):
		self.type=type
		self.value=value
	def __str__(self):
		return ‘Token({type},{value})‘.format(
			type=self.type,
			value=self.value
			)
class Lexer(object):
#词法分析器
#给每个词打标记
	def __init__(self,text):
		self.text=text
		self.pos=0
		self.current_char=self.text[self.pos]
	def error(self):
		raise Exception(‘Invalid Char‘)
	def advance(self):
		#往下走,取值
		self.pos+=1
		if self.pos>len(self.text)-1:
			self.current_char=None
		else:
			self.current_char=self.text[self.pos]
	
	def integer(self):
		#多位整数处理
		result=‘‘
		while self.current_char is not None and self.current_char.isdigit():
			result=result+self.current_char
                        #往下走,取值
			self.advance()
		return int(result)
	def deal_space(self):
		while self.current_char is not None and self.current_char.isspace():
			self.advance()
	def get_next_token(self):
		#打标记:1)pos+1,2)返回Token(类型,数值)
		while self.current_char is not None:
			if self.current_char.isspace():
				self.deal_space()
			if self.current_char.isdigit():
				return Token(INTEGER,self.integer())
			if self.current_char==‘+‘:
				self.advance()
				return Token(PLUS,‘+‘)
			if self.current_char==‘-‘:
				self.advance()
				return Token(MINUS,‘-‘)
			if self.current_char==‘*‘:
				self.advance()
				return Token(MUL,‘*‘)
			if self.current_char==‘/‘:
				self.advance()
				return Token(DIV,‘/‘)
			if self.current_char==‘(‘:
				self.advance()
				return Token(LPAREN,‘(‘)
			if self.current_char==‘)‘:
				self.advance()
				return Token(RPAREN,‘)‘)
			self.error()
		return Token(EOF,None)
	
class Interpreter(object):
#句法分析
#语法树
	def __init__(self,lexer):
		self.lexer=lexer
		self.current_token=self.lexer.get_next_token()
	def error(self):
		raise Exception(‘Invalid Syntax‘)
	def eat(self,token_type):
		if self.current_token.type==token_type:
			self.current_token=self.lexer.get_next_token()
		else:
			self.error()
	def factor(self):
		token=self.current_token
		if token.type==INTEGER:
			self.eat(INTEGER)
			return token.value
		elif token.type==LPAREN:
			self.eat(LPAREN)
			result=self.expr()
			self.eat(RPAREN)
			return result
		
	def term(self):
		result=self.factor()
		while self.current_token.type in (MUL,DIV):
			token=self.current_token
			if token.type==MUL:
				self.eat(MUL)
				result=result*self.factor()
			if token.type==DIV:
				self.eat(DIV)
				result=result/self.factor()
		return result
	def expr(self):
		result=self.term()
		while self.current_token.type in (PLUS,MINUS):
			token=self.current_token
			if token.type==PLUS:
				self.eat(PLUS)
				result=result+self.term()
			if token.type==MINUS:
				self.eat(MINUS)
				result=result-self.term()
		return result
            
def main():
	while True:
		try:
			text=input(‘calc_> ‘)
		except EOFError:
			break
		if not text:
			continue
		lexer=Lexer(text)
		result=Interpreter(lexer).expr()
		print(result)
if __name__==‘__main__‘:
    main()
实验结果:

对应结构图:

理解:
通过管道——过滤器体系结构可以将整个系统的输入、输出特性作为各个过滤器功能的合成,它具有天然的并发特性,很适合处理许多业务体系结构。
标签:结构图 except ima init nta ace val none 结果
原文地址:http://www.cnblogs.com/cq6723/p/7747934.html