目录
给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
以计算器为例,其语法规则为
expression ::= value | plus | minus
plus ::= expression ‘+’ expression
minus ::= expression ‘-’ expression
value ::= integer
这里的符号“::=”表示“定义为”的意思,竖线 | 表示或,左右的其中一个,引号内为字符本身,引号外为语法
解释:
在计算机科学中,抽象语法树(AbstractSyntaxTree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
用树形来表示符合文法规则的句子。

解释器模式包含以下主要角色。
抽象表达式类
- public abstract class AbstractExpression {
- abstract int interpret(Context context);
- }
环境类(作为终结者解释器与非终结者解释器取值的容器)
- public class Context {
- private Map
map = new HashMap<>(); -
- //添加表达式
- public void assign(Variable var, Integer value){
- map.put(var,value);
- }
-
- //获取表达式的值
- public int getValue(Variable var){
- return map.get(var);
- }
- }
非终结者解释器
- public class Variable extends AbstractExpression{
- private String name;
-
- public Variable(String name) {
- this.name = name;
- }
-
- @Override
- int interpret(Context context) {
- //由于还未终结,因此要接着拼接,自身将要拼接的的内容返回
- return context.getValue(this);
- }
-
- public String toString(){
- return name;
- }
- }
-
-
- //加法解释器
- public class Plus extends AbstractExpression{
-
- private AbstractExpression left;
- private AbstractExpression right;
-
- public Plus(AbstractExpression left, AbstractExpression right) {
- this.left = left;
- this.right = right;
- }
-
- @Override
- int interpret(Context context) {
- //根据初始化时的值来判断执行终结者还是非终结者的解释器
- return left.interpret(context)+right.interpret(context);
- }
-
- public String toString(){
- return left.toString()+"+"+right.toString();
- }
- }
-
-
- //减法表达式
- public class Minus extends AbstractExpression{
- private AbstractExpression left;
- private AbstractExpression right;
-
- public Minus(AbstractExpression left, AbstractExpression right) {
- this.left = left;
- this.right = right;
- }
-
- @Override
- int interpret(Context context) {
- return left.interpret(context)-right.interpret(context);
- }
-
- public String toString(){
- return left.toString()+"-"+right.toString();
- }
- }
终结者标识符
- public class Value extends AbstractExpression{
-
- private int value;
-
- public Value(int value) {
- this.value = value;
- }
-
- @Override
- int interpret(Context context) {
- return value;
- }
-
- public String toString(){
- return String.valueOf(value);
- }
- }
测试
- public class Client {
- public static void main(String[] args) {
- Context context = new Context();
-
- //定义了四个表达式变量
- Variable a = new Variable("a");
- Variable b = new Variable("b");
- Variable c = new Variable("c");
- Variable d = new Variable("d");
-
- Value value = new Value(5);
-
- context.assign(a,1);
- context.assign(b,2);
- context.assign(c,3);
- context.assign(d,4);
- //创建一个总表达式对象 a+b-c+d-value
- AbstractExpression abstractExpression =new Minus(new Plus(a,new Plus(new Minus(b,c),d)),value);
- System.out.println(abstractExpression+"="+abstractExpression.interpret(context));
- }
- }
a+b-c+d-5=-1
其实就是遍历二叉树,由于终结者表达式与非终结者表达式根据均继承了抽象表达式重写了interpret()方法,因此,在执行left与right的interpret()方法时,根据对象类型分别执行不同的重写方法。