130242014057 周陈清 第2次实验

Posted 爱殇cq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了130242014057 周陈清 第2次实验相关的知识,希望对你有一定的参考价值。

代码:

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()

 实验结果:

 

 对应结构图:

理解:

通过管道——过滤器体系结构可以将整个系统的输入、输出特性作为各个过滤器功能的合成,它具有天然的并发特性,很适合处理许多业务体系结构。

 

以上是关于130242014057 周陈清 第2次实验的主要内容,如果未能解决你的问题,请参考以下文章

第三次作业

2019_5_13_周事务

第六周总结&第四次实验报告

第5周实验--线性/非线性规划问题求解

130242014053 “电商系统某功能模块”需求分析与设计实验课小结

2017-2018-2 20179225 《网络攻防与实践》 第10周作业