10.21
实验17:解释器模式(选作)
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解解释器模式的动机,掌握该模式的结构;
2、能够利用解释器模式解决实际问题。
[实验任务一]:解释器模式
某机器人控制程序包含一些简单的英文指令,其文法规则如下:
expression ::= direction action distance | composite
composite ::= expression and expression
direction ::= ‘up’ | ‘down’ | ‘left’ | ‘right’
action ::= ‘move’ | ‘run’
distance ::= an integer //一个整数值
如输入:up move 5,则输出“向上移动5个单位”;输入:down run 10 and left move 20,则输出“向下移动10个单位再向左移动20个单位”。
实验要求:
1. 提交类图;
2. 提交源代码;
from abc import ABC, abstractmethod
# 抽象表达式类
class Expression(ABC):
@abstractmethod
def interpret(self):
pass
# 方向表达式类
class DirectionExpression(Expression):
def __init__(self, direction):
self.direction = direction
def interpret(self):
if self.direction == "up":
return "向上"
elif self.direction == "down":
return "向下"
elif self.direction == "left":
return "向左"
elif self.direction == "right":
return "向右"
# 动作表达式类
class ActionExpression(Expression):
def __init__(self, action):
self.action = action
def interpret(self):
if self.action == "move":
return "移动"
elif self.action == "run":
return "奔跑"
# 距离表达式类
class DistanceExpression(Expression):
def __init__(self, distance):
self.distance = distance
def interpret(self):
return f"{self.distance}个单位"
# 复合表达式类
class CompositeExpression(Expression):
def __init__(self, leftExpression, rightExpression):
self.leftExpression = leftExpression
self.rightExpression = rightExpression
def interpret(self):
left_result = self.leftExpression.interpret()
right_result = self.rightExpression.interpret()
return f"{left_result}{right_result}"
if __name__ == "__main__":
# 示例1:up move 5
direction_exp = DirectionExpression("up")
action_exp = ActionExpression("move")
distance_exp = DistanceExpression(5)
expression1 = CompositeExpression(CompositeExpression(direction_exp, action_exp), distance_exp)
print(expression1.interpret())
# 示例2:down run 10 and left move 20
direction_exp1 = DirectionExpression("down")
action_exp1 = ActionExpression("run")
distance_exp1 = DistanceExpression(10)
direction_exp2 = DirectionExpression("left")
action_exp2 = ActionExpression("move")
distance_exp2 = DistanceExpression(20)
expression2 = CompositeExpression(
CompositeExpression(direction_exp1, action_exp1),
CompositeExpression(direction_exp2, action_exp2)
)
print(expression2.interpret())
3. 注意编程规范。