解析器模式

什么是解析器模式

給定一種語(yǔ)言,定義它的文法表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中句子(通過(guò)解析器解析自定義的表達(dá)式返回解析后的信息)

示例圖

圖片.png

示例場(chǎng)景

使用自定義的表達(dá)式進(jìn)行相加 相減操作。
比如:e1=2 e2=8 e3=6, e1+e2=10, e2-e3=2, e1+e2-e3=4

示例代碼

1.創(chuàng)建Expression解析器接口

public interface Expression {
    int interpreter(Context context);
}

2.創(chuàng)建Context上下文類(lèi)

public class Context {
    private Map<Expression, Integer> map = new HashMap<>();

    //添加解析器對(duì)象
    public void add(Expression s, Integer value){
        map.put(s, value);
    }
    //獲取解析后的值
    public int getValue(Expression s){
        return map.get(s);
    }
}

3.創(chuàng)建TerminalExpression終結(jié)表達(dá)式

public class TerminalExpression implements  Expression{
    @Override
    public int interpreter(Context context) {
        return context.getValue(this);
    }
}

4.創(chuàng)建NonTerminalExpression非終結(jié)表達(dá)式

public abstract class NonTerminalExpression implements Expression{
    Expression e1,e2;
    public NonTerminalExpression(Expression e1, Expression e2){
        this.e1 = e1;
        this.e2 = e2;
    }
}

5.創(chuàng)建非終結(jié)表達(dá)式實(shí)現(xiàn)類(lèi)PlusOperation相加操作和MinusOperation相減操作

public class PlusOperation extends NonTerminalExpression {
    public PlusOperation(Expression e1, Expression e2) {
        super(e1, e2);
    }

    //將兩個(gè)表達(dá)式相加
    @Override
    public int interpreter(Context context) {
        return this.e1.interpreter(context) + this.e2.interpreter(context);
    }
}
public class MinusOperation  extends NonTerminalExpression {
    public MinusOperation(Expression e1, Expression e2) {
        super(e1, e2);
    }

    //將兩個(gè)表達(dá)式相減
    @Override
    public int interpreter(Context context) {
        return this.e1.interpreter(context) - this.e2.interpreter(context);
    }
}

6.創(chuàng)建Client啟動(dòng)類(lèi)

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        TerminalExpression e1 = new TerminalExpression();
        TerminalExpression e2 = new TerminalExpression();
        TerminalExpression e3 = new TerminalExpression();
        context.add(e1, 2);
        context.add(e2, 8);
        context.add(e3, 6);
        System.out.println("------------------------------表達(dá)式相減操作");
        MinusOperation minusOperation = new MinusOperation(e1, e2);
        System.out.println(minusOperation.interpreter(context));
        System.out.println("------------------------------表達(dá)式相加操作");
        PlusOperation plusOperation = new PlusOperation(e1,e3);
        System.out.println(plusOperation.interpreter(context));
        System.out.println("------------------------------表達(dá)式先加再減操作");
        Expression expression = new MinusOperation(new PlusOperation(e1, e2), e3);
        System.out.println(expression.interpreter(context));
    }
}

7.運(yùn)行結(jié)果


圖片.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 解析器模式給定一個(gè)語(yǔ)言,定義它的文法表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該標(biāo)識(shí)來(lái)解釋語(yǔ)言中的句子。這種模式被用在...
    巨子聯(lián)盟閱讀 528評(píng)論 0 0
  • 一、模式簡(jiǎn)介 定義:給分析對(duì)象定義一個(gè)語(yǔ)言,并定義該語(yǔ)言的文法表示,再設(shè)計(jì)一個(gè)解析器來(lái)解釋語(yǔ)言中的句子,用編譯語(yǔ)言...
    潛心之力閱讀 454評(píng)論 0 0
  • 解析器模式-定義? 定義:給定一個(gè)語(yǔ)言,定義它的文法的一種表達(dá)式,并且定義一個(gè)解析器,該解析器使用該表示來(lái)解析語(yǔ)言...
    架構(gòu)師的一小步閱讀 338評(píng)論 0 0
  • 定義 給定一個(gè)語(yǔ)言,定義它的語(yǔ)法的一種表達(dá)式,并且定義一個(gè)解析器,該解析器使用該表達(dá)式來(lái)解析語(yǔ)言中的句子; 文法 ...
    fanren閱讀 195評(píng)論 0 0
  • 解析器模式:解析腳本的語(yǔ)言解析器。 php源于c語(yǔ)言,其實(shí)是用c語(yǔ)言解析了php腳本,那么php有是如何解析其他語(yǔ)...
    美雨知春閱讀 609評(píng)論 0 1

友情鏈接更多精彩內(nèi)容