码迷,mamicode.com
首页 > 其他好文 > 详细

130242014070 张宇 第2次试验

时间:2017-10-28 23:49:39      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:alt   next   lexer   col   符号   exe   image   mat   current   

一、实验目的

1.熟悉体系结构的风格的概念

2.理解和应用管道过滤器型的风格。

3、理解解释器的原理

4、理解编译器模型

二、实验环境

硬件: 

软件:Python或任何一种自己喜欢的语言

三、实验内容

1、实现“四则运算”的简易翻译器。

结果要求:

1)实现加减乘除四则运算,允许同时又多个操作数,如:2+3*5-6 结果是11

2)被操作数为整数,整数可以有多位

3)处理空格

4)输入错误显示错误提示,并返回命令状态“CALC”

 技术分享

 

  图1    实验结果示例

加强练习:

1、有能力的同学,可以尝试实现赋值语句,例如x=2+3*5-6,返回x=11。(注意:要实现解释器的功能,而不是只是显示)

2、尝试实现自增和自减符号,例如x++ 

2、采用管道-过滤器(Pipes and Filters)风格实现解释器

 技术分享

 

                        图2  管道-过滤器风格

 技术分享

 

                     图 3  编译器模型示意图

本实验,实现的是词法分析和语法分析两个部分。

四、实验步骤:

     要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图。

总体结构图参照体系结构风格。

算法结构图参照如下:

源代码:

 

  1 INTEGER,PLUS,MINUS,MUL,DIV,LPAREN,RPAREN,EOF=(
  2 INTEGER,PLUS,MINUS,MUL,DIV,LPAREN,RPAREN,EOF)
  3 
  4 class Token(object):
  5     def  __init__(self,type,value):
  6         self.type=type
  7         self.value=value
  8     def __str__(self):
  9         return Token({type},{value}).format(
 10             type=self.type,
 11             value=self.value
 12             )
 13 
 14 class Lexer(object):
 15 #词法分析器
 16 #给每个词打标记
 17     def __init__(self,text):
 18         self.text=text
 19         self.pos=0
 20         self.current_char=self.text[self.pos]
 21 
 22 
 23     def error(self):
 24         raise Exception(Invalid Char)
 25 
 26     def advance(self):
 27         #往下走,取值
 28         self.pos+=1
 29         if self.pos>len(self.text)-1:
 30             self.current_char=None
 31         else:
 32             self.current_char=self.text[self.pos]
 33     
 34     def integer(self):
 35         #多位整数处理
 36         result=‘‘
 37         while self.current_char is not None and self.current_char.isdigit():
 38             result=result+self.current_char
 39                         #往下走,取值
 40             self.advance()
 41         return int(result)
 42     def deal_space(self):
 43         while self.current_char is not None and self.current_char.isspace():
 44             self.advance()
 45 
 46     def get_next_token(self):
 47         #打标记:1)pos+1,2)返回Token(类型,数值)
 48         while self.current_char is not None:
 49             if self.current_char.isspace():
 50                 self.deal_space()
 51 
 52             if self.current_char.isdigit():
 53                 return Token(INTEGER,self.integer())
 54             if self.current_char==+:
 55                 self.advance()
 56                 return Token(PLUS,+)
 57             if self.current_char==-:
 58                 self.advance()
 59                 return Token(MINUS,-)
 60             if self.current_char==*:
 61                 self.advance()
 62                 return Token(MUL,*)
 63             if self.current_char==/:
 64                 self.advance()
 65                 return Token(DIV,/)
 66             if self.current_char==(:
 67                 self.advance()
 68                 return Token(LPAREN,()
 69             if self.current_char==):
 70                 self.advance()
 71                 return Token(RPAREN,))
 72             self.error()
 73         return Token(EOF,None)
 74 
 75     
 76 class Interpreter(object):
 77 #句法分析
 78 #语法树
 79     def __init__(self,lexer):
 80         self.lexer=lexer
 81         self.current_token=self.lexer.get_next_token()
 82     def error(self):
 83         raise Exception(Invalid Syntax)
 84 
 85     def eat(self,token_type):
 86         if self.current_token.type==token_type:
 87             self.current_token=self.lexer.get_next_token()
 88         else:
 89             self.error()
 90     def factor(self):
 91         token=self.current_token
 92         if token.type==INTEGER:
 93             self.eat(INTEGER)
 94             return token.value
 95         elif token.type==LPAREN:
 96             self.eat(LPAREN)
 97             result=self.expr()
 98             self.eat(RPAREN)
 99             return result
100         
101     def term(self):
102         result=self.factor()
103         while self.current_token.type in (MUL,DIV):
104             token=self.current_token
105             if token.type==MUL:
106                 self.eat(MUL)
107                 result=result*self.factor()
108             if token.type==DIV:
109                 self.eat(DIV)
110                 result=result/self.factor()
111         return result
112     def expr(self):
113         result=self.term()
114         while self.current_token.type in (PLUS,MINUS):
115             token=self.current_token
116             if token.type==PLUS:
117                 self.eat(PLUS)
118                 result=result+self.term()
119             if token.type==MINUS:
120                 self.eat(MINUS)
121                 result=result-self.term()
122         return result
123             
124 
125 
126 
127 def main():
128     while True:
129         try:
130             text=input(calc_> )
131         except EOFError:
132             break
133         if not text:
134             continue
135         lexer=Lexer(text)
136         result=Interpreter(lexer).expr()
137         print(result)
138 
139 if __name__==__main__:
140     main()
截图:
技术分享





130242014070 张宇 第2次试验

标签:alt   next   lexer   col   符号   exe   image   mat   current   

原文地址:http://www.cnblogs.com/izhangyu/p/7748490.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!