语法规则也是类
前言
解释器模式与编译原理中学的编译器很像.不过这个解释器就是完成了对语法的解析,将一个个的词组解释称一个个语法范畴,之后再拿来使用.
在Interpreter模式中,程序要解决的问题会被用非常简单的迷你语言表述出来,即用迷你语言编写的迷你程序把具体的问题表述出来.迷你程序是无法单独工作的.我们还需要用Java语言编写一个负责”翻译”的程序.翻译程序会理解迷你语言,并解释和运行迷你程序.这段翻译程序也被称为解释器.这样,当需要解决的问题发生变化时,不需要修改Java语言程序,只需要修改迷你语言程序即可应对.
如下图,我们在使用Interpreter模式后,我们就无需修改Java程序,只需修改迷你语言编写的迷你程序.
示例
本程序使用自顶向下文法来解析源程序:
迷你语言语法(控制玩具车的迷你语言)
1 | <program> ::= program <Command List> |
迷你程序 program repeat 4 go right end end 的语法树
类的一览
名字 | 说明 |
---|---|
Node | 表示语法树”节点”的类 |
ProgramNode | 对应<program> 的类 |
CommandListNode | <command list> 的类 |
CommandNode | 对应<command> 的类 |
RepeatCommandNode | 对应<repeat command> 的类 |
PrimitiveCommandNode | 对应<primitive command> 的类 |
Context | 表示语法解析上下文的类 |
ParseException | 表示语法解析可能发生的异常的类 |
Main | 测试程序行为的类 |
- 示例程序类图 | |
Node类
ProgramNode类:起始节点
<program> -> program <Command List>
CommandListNode类:
<Command List> -> <Command>* end
CommandNode类:
<Command> -> <Repeat Command> | <Primitive Command>
RepeatCommandNode 类:
<Repeat Command> -> repeat <number> <Command List>
PrimitiveCommandNode类:
<Primitive Command> -> go | right | left
Context 类,承载了词法分析的职责,为上面的语法树提供单词,遍历程序,当然没考虑到程序的注释
ParseException类:
Main类
1
2角色
角色:AbstractExpression(抽象表达式)、TerminalExpression(终结表达式、具体实现)、NonterminalExpression(非终结表达式、具体实现)、Context(上下文,被解析对象)、Clinet(调用者)