0%

设计模式之Interpreter模式


语法规则也是类

前言

解释器模式与编译原理中学的编译器很像.不过这个解释器就是完成了对语法的解析,将一个个的词组解释称一个个语法范畴,之后再拿来使用.

在Interpreter模式中,程序要解决的问题会被用非常简单的迷你语言表述出来,即用迷你语言编写的迷你程序把具体的问题表述出来.迷你程序是无法单独工作的.我们还需要用Java语言编写一个负责”翻译”的程序.翻译程序会理解迷你语言,并解释和运行迷你程序.这段翻译程序也被称为解释器.这样,当需要解决的问题发生变化时,不需要修改Java语言程序,只需要修改迷你语言程序即可应对.

如下图,我们在使用Interpreter模式后,我们就无需修改Java程序,只需修改迷你语言编写的迷你程序.

示例

本程序使用自顶向下文法来解析源程序:
迷你语言语法(控制玩具车的迷你语言)

1
2
3
4
5
<program> ::= program <Command List>
<Command List> ::= <Command>* end
<Command> ::= <Repeat Command> | <Primitive Command>
<Repeat Command> ::= repeat <number> <Command List>
<Primitive Command> ::= go | right | left
  • 迷你程序 program repeat 4 go right end end 的语法树

  • 类的一览

名字 说明
Node 表示语法树”节点”的类
ProgramNode 对应<program>的类
CommandListNode <command list>的类
CommandNode 对应<command>的类
RepeatCommandNode 对应<repeat command>的类
PrimitiveCommandNode 对应<primitive command>的类
Context 表示语法解析上下文的类
ParseException 表示语法解析可能发生的异常的类
Main 测试程序行为的类
- 示例程序类图
  1. Node类

  2. ProgramNode类:起始节点 <program> -> program <Command List>

  3. CommandListNode类: <Command List> -> <Command>* end

  4. CommandNode类: <Command> -> <Repeat Command> | <Primitive Command>

  5. RepeatCommandNode 类:<Repeat Command> -> repeat <number> <Command List>

  6. PrimitiveCommandNode类:<Primitive Command> -> go | right | left

  7. Context 类,承载了词法分析的职责,为上面的语法树提供单词,遍历程序,当然没考虑到程序的注释

  8. ParseException类:

  9. Main类

    1
    2


    角色

角色:AbstractExpression(抽象表达式)、TerminalExpression(终结表达式、具体实现)、NonterminalExpression(非终结表达式、具体实现)、Context(上下文,被解析对象)、Clinet(调用者)

Thank you for your support