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__":
    # 示例1up 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())

    # 示例2down 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. 注意编程规范。

 

 

posted @ 2024-11-27 08:20  The-rich  阅读(8)  评论(0)    收藏  举报