首页 > 其他分享 >24_解释器模式

24_解释器模式

时间:2024-03-17 11:47:02浏览次数:13  
标签:24 解释器 string 模式 content ExpressionBase public 表达式

解释器模式是一种行为设计模式,它通过定义一个语言的文法规则,并且根据规则解释和执行对应的语言表达式。

在解释器模式中,通过定义抽象表达式(Abstract Expression)和具体表达式(Concrete Expression)来表示语言中的各种表达式。抽象表达式定义了表达式的解释方法,而具体表达式则实现了解释方法。

解释器模式包含以下几个角色:

  1. 抽象表达式(Abstract Expression):定义了表达式解释方法的接口。

  2. 终结符表达式(Terminal Expression):实现了解释方法,表示语言中的终结符表达式。

  3. 非终结符表达式(Non-terminal Expression):实现了解释方法,表示语言中的非终结符表达式。

  4. 环境(Context):包含了解释器需要的信息,负责存储和传递变量的值等。

解释器模式的工作流程如下:

  1. 定义语言的文法规则,并将每个规则抽象成一个抽象表达式。

  2. 实现具体表达式,来表示语言中的各种表达式。

  3. 根据具体情况,创建具体表达式的实例,并将其组合成一个解释器树。

  4. 调用解释器树的解释方法,对语言表达式进行解释和执行。

解释器模式的优点包括:

  1. 可扩展性好,可以动态地添加新的表达式。

  2. 可以灵活地改变文法规则和解释方法。

  3. 可以方便地实现对语言表达式的解释和执行。

解释器模式适用于以下情况:

  1. 有一个简单的语言,需要解释和执行其中的表达式。

  2. 表达式的数量和复杂度有限,且经常需要进行修改和扩展。

总之,解释器模式是一种通过定义文法规则来解释和执行语言表达式的设计模式。它可以灵活地对语言进行解释和执行,适用于处理简单的、数量有限的语言表达式。

 

案例场景:

指令:
方向:up=向上,down=向下,left=向左,right=向右
模式:move=移动,run=快速移动
距离:实际值,不解释

表达式:string expression="up move 100 and down run 200 and left run 300";
指令格式:方向 运动模式 距离值

 

Abstract Expression

public abstract class ExpressionBase
    {
        public abstract string Interpret();
    }

 

 Terminal Expression

/// <summary>
    /// 方向模式的解释器表达式
    /// </summary>
    public class DirectionExpression : ExpressionBase
    {
        private string content;

        public DirectionExpression(string content)
        {
            this.content = content;
        }

        public override string Interpret()
        {
            switch (content)
            {
                case "up":
                    return "向上";
                    break;
                case "down":
                    return "向下";
                    break;
                case "left":
                    return "向左";
                    break;
                case "right":
                    return "向右";
                    break;
                default:
                    return "方向错误";
                    break;
            }
        }
    }
/// <summary>
    /// 运动模式的解释器表达式
    /// </summary>
    public class ModeExpression : ExpressionBase
    {
        private string content;

        public ModeExpression(string content)
        {
            this.content = content;
        }
        public override string Interpret()
        {
             if(this.content=="move")
            {
                return "移动";
            }
             else if(content=="run")
            {
                return "快速移动";
            }
             else
            {
                return "模式错误";
            }
        }
    }
/// <summary>
    /// 距离表达式
    /// </summary>
    public class DistanceExpression : ExpressionBase
    {
        private string content;

        public DistanceExpression(string content)
        {
            this.content = content;
        }
        public override string Interpret()
        {
            return content;
        }
    }

 

/// <summary>
    /// 终结符表达式
    /// </summary>
    public class TerminalExpression: ExpressionBase
    {
        private ExpressionBase direction, mode, distance;

        public TerminalExpression(ExpressionBase direction, ExpressionBase mode, ExpressionBase distance)
        {
            this.direction = direction;
            this.mode = mode;
            this.distance = distance;
        }

        public override string Interpret()
        {
            return string.Concat(direction.Interpret(), mode.Interpret(), distance.Interpret());
        }
    }

 

 Non-terminal Expression

/// <summary>
    /// 非终结符表达式
    /// </summary>
    public class NonTerminalExpression : ExpressionBase
    {
        private ExpressionBase left,right;

        public NonTerminalExpression(ExpressionBase left, ExpressionBase right)
        {
            this.left = left;
            this.right = right;
        }   

        public override string Interpret()
        {
            return $"{left.Interpret()}  然后  {right.Interpret()}";
        }
    }

 

Context

public class Context
    {
        private Stack<ExpressionBase> stack=new Stack<ExpressionBase>();
        private ExpressionBase direction, mode, distance, all;
        public void Execute(string content)
        {
            string[] array = content.Split(' ');
            for(int i=0;i<array.Length;i++)
            {
                if (array[i]=="and")
                {
                    ExpressionBase left=stack.Pop();
                    direction = new DirectionExpression(array[++i]);
                    mode = new ModeExpression(array[++i]);
                    distance = new DistanceExpression(array[++i]);
                    ExpressionBase right=new TerminalExpression(direction, mode, distance);
                    ExpressionBase end = new NonTerminalExpression(left, right);
                    stack.Push(end);
                }
                else
                {
                    direction= new DirectionExpression(array[i]);
                    mode = new ModeExpression(array[++i]);
                    distance = new DistanceExpression(array[++i]);
                    ExpressionBase end =new TerminalExpression(direction, mode, distance);
                    stack.Push(end);
                }
            }
            all=stack.Pop();
        }

        public string InterpretAll()
        {
            return all.Interpret();
        }
    }

 

调用

 internal class Client
    {
        public void Start()
        {
            Context context = new Context();
            string expression = "up move 100 and down run 200 and left run 300";
            context.Execute(expression);
            string result = context.InterpretAll();
            Console.WriteLine(result);
        }
    }
 static void Main(string[] args)
        {
            new Client().Start();
            Console.ReadKey();
            Console.WriteLine("Hello, World!");
        }

 

 

标签:24,解释器,string,模式,content,ExpressionBase,public,表达式
From: https://www.cnblogs.com/MingQiu/p/18078345

相关文章

  • 2024 年值得关注的三大 DevOps 趋势
    在过去几年中,DevOps世界以前所未有的速度发展,但它仍然是许多组织效率、创新和数字化转型的主要驱动力。Google的2023年加速DevOps状态报告显示,公司的软件交付性能质量可以预测组织绩效、团队绩效和员工福祉。2024年,从业者预计有几个趋势会对行业产生重大影响。随着时......
  • 策略模式-23
    概述策略模式(StrategyPattern)又称Policy,它定义并封装每一种算法,这些算法可以相互替换。优点:符合开闭原则。缺点:需要知道并理解每个算法才能选择合适的算法。interfaceSort{abstractvoidsort(int[]a);}classBubbleSortimplementsSort{publicvoidsort......
  • 20231325贾罗祁 2023-2024-2《Python程序设计》实验一报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验一报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年3月13日必修/选修:公选课1.实验内容熟悉Python的操作学会调试程序编译循环的剪刀石头布游戏创建gitee账户并推送上传......
  • 23_责任链模式
    责任链模式是一种行为设计模式,它可以将请求的发送者和接收者解耦,并且允许多个对象都有机会处理请求。在责任链模式中,每个处理者都持有对下一个处理者的引用,形成一个链条。当请求发出时,从链条的头部开始,每个处理者都有机会处理请求。如果某个处理者能够处理请求,它就会处理请求并结......
  • Java设计模式之模板模式。
    模板模式(TemplatePattern)是Java中常用的设计模式之一,是一种行为设计模式,它定义了一个算法的骨架,将具体步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤,下面通过Java代码看看模板模式的用法。//模板类abstractclassAbstr......
  • Java设计模式之单例模式。
    在Java中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点下面介绍七种常见的单例模式实现方式以及它们的优缺点。1.懒汉式(线程不安全)publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publi......
  • Java设计模式之工厂模式。
    工厂模式(FactoryPattern)是Java中最常用的设计模式之一,是一种创建型设计模式,用于创建对象而不暴露创建逻辑。工厂模式包括工厂方法模式和抽象工厂模式,下面结合代码看看它的使用用法吧。//产品接口interfaceProduct{voidproduce();}//具体产品类classCon......
  • C++发布订阅者模式:实现简单消息传递系统
     概述:这个C++示例演示了发布者-订阅者模式的基本实现。通过`Event`类,发布者`Publisher`发送数据,而订阅者`Subscriber`订阅并处理数据。通过简单的回调机制,实现了组件间松散耦合的消息传递。好的,我将为你提供一个简单的C++实例,演示如何使用发布者-订阅者模式。在这个例......
  • java设计模式
    单例设计模式java实现(一)单例设计模式​单例设计模式(SingletonPattern)确保某个类中只有一个实例,而且这个类是不能被实例化的,也就是不能用new关键字来创建对象,该类提供了公共静态的方法,用于返回该类对象,不需要自行实例化。而单例模式有分为饿汉式,以及懒汉式。特点一......
  • YOLOv9改进项目|关于本周更新计划的说明24/3/12
     目前售价售价59.9,改进点30个 专栏地址:专栏介绍:YOLOv9改进系列|包含深度学习最新创新,助力高效涨点!!!日期:24/3/12本周更新计划说明:        1. 更新华为GoldYOLO中的GD机制        2. 更新Bifpn加权双向特征融合     3. 更新去除辅......