国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Go和Java實(shí)現(xiàn)解釋器模式

這篇具有很好參考價(jià)值的文章主要介紹了Go和Java實(shí)現(xiàn)解釋器模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Go和Java實(shí)現(xiàn)解釋器模式

下面通過一個(gè)四則運(yùn)算來說明解釋器模式的使用。

1、解釋器模式

解釋器模式提供了評估語言的語法或表達(dá)式的方式,它屬于行為型模式。這種模式實(shí)現(xiàn)了一個(gè)表達(dá)式接口,該接口

解釋一個(gè)特定的上下文。這種模式被用在 SQL 解析、符號處理引擎等。

  • 意圖:給定一個(gè)語言,定義它的文法表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該標(biāo)識來解釋語言中的句子。

  • 主要解決:對于一些固定文法構(gòu)建一個(gè)解釋句子的解釋器。

  • 何時(shí)使用:如果一種特定類型的問題發(fā)生的頻率足夠高,那么可能就值得將該問題的各個(gè)實(shí)例表述為一個(gè)簡單

    語言中的句子。這樣就可以構(gòu)建一個(gè)解釋器,該解釋器通過解釋這些句子來解決該問題。

  • 如何解決:構(gòu)建語法樹,定義終結(jié)符與非終結(jié)符。

  • 關(guān)鍵代碼:構(gòu)建環(huán)境類,包含解釋器之外的一些全局信息,一般是 HashMap。

  • 應(yīng)用實(shí)例:編譯器、運(yùn)算表達(dá)式計(jì)算。

  • 優(yōu)點(diǎn):1、可擴(kuò)展性比較好,靈活。 2、增加了新的解釋表達(dá)式的方式。 3、易于實(shí)現(xiàn)簡單文法。

  • 缺點(diǎn):1、可利用場景比較少。 2、對于復(fù)雜的文法比較難維護(hù)。 3、解釋器模式會引起類膨脹。 4、解釋器模

    式采用遞歸調(diào)用方法。

  • 使用場景:1、可以將一個(gè)需要解釋執(zhí)行的語言中的句子表示為一個(gè)抽象語法樹。 2、一些重復(fù)出現(xiàn)的問題可

    以用一種簡單的語言來進(jìn)行表達(dá)。 3、一個(gè)簡單語法需要解釋的場景。

  • 注意事項(xiàng):可利用場景比較少,JAVA 中如果碰到可以用 expression4J 代替。

  • 適用性:

    當(dāng)有一個(gè)語言需要解釋執(zhí)行,并且你可將該語言中的句子表示為一個(gè)抽象語法樹時(shí),可使用解釋器模式,而當(dāng)

    存在當(dāng)下情況時(shí)該模式效果最好:

    該文法簡單對于復(fù)雜的文法,文法的層次變得龐大而無法管理。

    效率不是一個(gè)關(guān)鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實(shí)現(xiàn)的,而是首先將它們轉(zhuǎn)換成另

    一種形式。文章來源地址http://www.zghlxwxcb.cn/news/detail-650461.html

2、Go實(shí)現(xiàn)解釋器模式

package interpreter

// ========== ArithmeticInterpreter ==========
type ArithmeticInterpreter interface {
	Interpret() int
}
package interpreter

// ========== NumInterpreter ==========
type NumInterpreter struct {
	Value int
}

func NewNumInterpreter(value int) *NumInterpreter {
	return &NumInterpreter{Value: value}
}

func (numInterpreter *NumInterpreter) Interpret() int {
	return numInterpreter.Value
}
package interpreter

// ========== AddInterpreter ==========
type AddInterpreter struct {
	left  ArithmeticInterpreter
	right ArithmeticInterpreter
}

func NewAddInterpreter(left, right ArithmeticInterpreter) *AddInterpreter {
	return &AddInterpreter{left: left, right: right}
}

func (addInterpreter *AddInterpreter) Interpret() int {
	return addInterpreter.left.Interpret() + addInterpreter.right.Interpret()
}
package interpreter

// ========== SubInterpreter ==========
type SubInterpreter struct {
	left  ArithmeticInterpreter
	right ArithmeticInterpreter
}

func NewSubInterpreter(left, right ArithmeticInterpreter) *SubInterpreter {
	return &SubInterpreter{left: left, right: right}
}

func (subInterpreter *SubInterpreter) Interpret() int {
	return subInterpreter.left.Interpret() - subInterpreter.right.Interpret()
}
package interpreter

// ========== MultiInterpreter ==========
type MultiInterpreter struct {
	left  ArithmeticInterpreter
	right ArithmeticInterpreter
}

func NewMultiInterpreter(left, right ArithmeticInterpreter) *MultiInterpreter {
	return &MultiInterpreter{left: left, right: right}
}

func (multiInterpreter *MultiInterpreter) Interpret() int {
	return multiInterpreter.left.Interpret() * multiInterpreter.right.Interpret()
}
package interpreter

// ========== DivInterpreter ==========
type DivInterpreter struct {
	left  ArithmeticInterpreter
	right ArithmeticInterpreter
}

func NewDivInterpreter(left, right ArithmeticInterpreter) *DivInterpreter {
	return &DivInterpreter{left: left, right: right}
}

func (divInterpreter *DivInterpreter) Interpret() int {
	return divInterpreter.left.Interpret() / divInterpreter.right.Interpret()
}
package interpreter

const (
	ADD = "+"
	SUB = "-"
	MUL = "*"
	DIV = "/"
)

// =========== OperatorUtil ==========
type OperatorUtil struct{}

func (OperatorUtil *OperatorUtil) IsOperator(symbol string) bool {
	return ("+" == symbol || "-" == symbol || "*" == symbol)
}

func (operatorUtil *OperatorUtil) GetInterpreter(left, right ArithmeticInterpreter, symbol string) ArithmeticInterpreter {
	if ADD == symbol {
		return NewAddInterpreter(left, right)
	} else if SUB == symbol {
		return NewSubInterpreter(left, right)
	} else if MUL == symbol {
		return NewMultiInterpreter(left, right)
	} else if DIV == symbol {
		return NewDivInterpreter(left, right)
	}
	return nil
}
package interpreter

import (
	"fmt"
	"strconv"
	"strings"
)

type Calculator struct{}

var (
	operatorUtil = OperatorUtil{}
	stack        = make([]ArithmeticInterpreter, 0)
)

func (calculator *Calculator) Parse(expression string) {
	elements := strings.Split(expression, " ")
	var leftExpr, rightExpr ArithmeticInterpreter
	for i := 0; i < len(elements); i++ {
		operator := elements[i]
		if operatorUtil.IsOperator(operator) {
			// 出棧
			leftExpr = stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			i++
			ele, _ := strconv.Atoi(elements[i])
			rightExpr = NewNumInterpreter(ele)
			fmt.Printf("出棧: %d 和 %d \n", leftExpr.Interpret(), rightExpr.Interpret())
			stack = append(stack, operatorUtil.GetInterpreter(leftExpr, rightExpr, operator))
			fmt.Println("應(yīng)用運(yùn)算符: " + operator)
		} else {
			ele, _ := strconv.Atoi(elements[i])
			numInterpreter := NewNumInterpreter(ele)
			stack = append(stack, numInterpreter)
			fmt.Printf("入棧: %d \n", numInterpreter.Interpret())
		}
	}

}

func (calculator *Calculator) Result() int {
	value := stack[len(stack)-1]
	stack = stack[:len(stack)-1]
	return value.Interpret()
}
package main

import (
	"fmt"
	. "proj/interpreter"
)

func main() {
	calculator := Calculator{}
	calculator.Parse("10 + 30")
	fmt.Println("result:", calculator.Result())

	calculator.Parse("10 + 30 - 20")
	fmt.Println("result: ", calculator.Result())

	calculator.Parse("100 * 2 + 400 - 20 + 66")
	fmt.Println("result:", calculator.Result())
}
# 程序輸出
入棧: 10 
出棧: 1030   
應(yīng)用運(yùn)算符: +
result: 40
入棧: 10 
出棧: 1030 
應(yīng)用運(yùn)算符: +
出棧: 4020 
應(yīng)用運(yùn)算符: -
result:  20
入棧: 100 
出棧: 1002 
應(yīng)用運(yùn)算符: *
出棧: 200400 
應(yīng)用運(yùn)算符: +
出棧: 60020 
應(yīng)用運(yùn)算符: -
出棧: 58066 
應(yīng)用運(yùn)算符: +
result: 40
入棧: 10 
出棧: 1030 
應(yīng)用運(yùn)算符: +
出棧: 4020 
應(yīng)用運(yùn)算符: -
result:  20
入棧: 100 
出棧: 1002 
應(yīng)用運(yùn)算符: *
出棧: 200400 
應(yīng)用運(yùn)算符: +
出棧: 60020 
應(yīng)用運(yùn)算符: -
出棧: 58066 
應(yīng)用運(yùn)算符: +
result: 646

3、Java實(shí)現(xiàn)解釋器模式

package com.interpreter;

// ========== ArithmeticInterpreter ==========
public interface ArithmeticInterpreter {
    int interpret();
}
package com.interpreter;

// ========== ArithmeticInterpreter ==========
public abstract class Interpreter implements ArithmeticInterpreter{

    protected ArithmeticInterpreter left;
    protected ArithmeticInterpreter right;

    public Interpreter(ArithmeticInterpreter left, ArithmeticInterpreter right) {
        this.left = left;
        this.right = right;
    }
}
package com.interpreter;

// ========== NumInterpreter ==========
public class NumInterpreter implements ArithmeticInterpreter {

    private int value;

    public NumInterpreter(int value) {
        this.value = value;
    }

    @Override
    public int interpret() {
        return this.value;
    }

}
package com.interpreter;

// ========== AddInterpreter ==========
public class AddInterpreter extends Interpreter {

    public AddInterpreter() {
        super(left, right);
    }

    @Override
    public int interpret() {
        return this.left.interpret() + this.right.interpret();
    }
}
package com.interpreter;

// ========== MultiInterpreter ==========
public class MultiInterpreter extends Interpreter {

    public MultiInterpreter(ArithmeticInterpreter left, ArithmeticInterpreter right) {
        super(left, right);
    }

    @Override
    public int interpret() {
        return this.left.interpret() * this.right.interpret();
    }
}
package com.interpreter;

// ========== SubInterpreter ==========
public class SubInterpreter  extends Interpreter {

    public SubInterpreter(ArithmeticInterpreter left, ArithmeticInterpreter right) {
        super(left, right);
    }

    @Override
    public int interpret() {
        return this.left.interpret() - this.right.interpret();
    }
}
package com.interpreter;

// ========== DivInterpreter ==========
public class DivInterpreter extends Interpreter {

    public DivInterpreter(ArithmeticInterpreter left, ArithmeticInterpreter right) {
        super(left, right);
    }

    @Override
    public int interpret() {
        return this.left.interpret() / this.right.interpret();
    }
}
package com.interpreter;

// =========== OperatorUtil ==========
public class OperatorUtil {

    private final static String ADD = "+";
    private final static String SUB = "-";
    private final static String MUL = "*";
    private final static String DIV = "/";

    public static boolean isOperator(String symbol) {
        return ("+".equals(symbol) || "-".equals(symbol) || "*".equals(symbol));
    }

    public static Interpreter getInterpreter(ArithmeticInterpreter left, ArithmeticInterpreter right, String symbol) {
        if (ADD.equals(symbol)) {
            return new AddInterpreter(left, right);
        } else if (SUB.equals(symbol)) {
            return new SubInterpreter(left, right);
        } else if (MUL.equals(symbol)) {
            return new MultiInterpreter(left, right);
        } else if (DIV.equals(symbol)) {
            return new DivInterpreter(left, right);
        }
        return null;
    }
}
package com.interpreter;

import java.util.Stack;

// ========== Calculator ==========
public class Calculator {

    private final Stack<ArithmeticInterpreter> stack = new Stack<>();

    public void parse(String expression) {
        String[] elements = expression.split(" ");
        ArithmeticInterpreter leftExpr, rightExpr;
        for (int i = 0; i < elements.length; i++) {
            String operator = elements[i];
            if (OperatorUtil.isOperator(operator)) {
                leftExpr = this.stack.pop();
                rightExpr = new NumInterpreter(Integer.parseInt(elements[++i]));
                System.out.println("出棧: " + leftExpr.interpret() + " 和 " + rightExpr.interpret());
                this.stack.push(OperatorUtil.getInterpreter(leftExpr, rightExpr, operator));
                System.out.println("應(yīng)用運(yùn)算符: " + operator);
            } else {
                NumInterpreter numInterpreter = new NumInterpreter(Integer.parseInt(elements[i]));
                this.stack.push(numInterpreter);
                System.out.println("入棧: " + numInterpreter.interpret());
            }
        }
    }

    public int result() {
        return this.stack.pop().interpret();
    }

}
package com.interpreter;

public class Test {

    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        calculator.parse("10 + 30");
        System.out.println("result: " + calculator.result());

        calculator.parse("10 + 30 - 20");
        System.out.println("result: " + calculator.result());

        calculator.parse("100 * 2 + 400 - 20 + 66");
        System.out.println("result: " + calculator.result());
    }
}
# 程序輸出
入棧: 10
出棧: 1030
應(yīng)用運(yùn)算符: +
result: 40
入棧: 10
出棧: 1030
應(yīng)用運(yùn)算符: +
出棧: 4020
應(yīng)用運(yùn)算符: -
result: 20
入棧: 100
出棧: 1002
應(yīng)用運(yùn)算符: *
出棧: 200400
應(yīng)用運(yùn)算符: +
出棧: 60020
應(yīng)用運(yùn)算符: -
出棧: 58066
應(yīng)用運(yùn)算符: +
result: 646

到了這里,關(guān)于Go和Java實(shí)現(xiàn)解釋器模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity實(shí)現(xiàn)設(shè)計(jì)模式——解釋器模式

    Unity實(shí)現(xiàn)設(shè)計(jì)模式——解釋器模式

    解釋器模式(Interpreter Pattern)是一種按照規(guī)定語法進(jìn)行解析的模式,現(xiàn)實(shí)項(xiàng)目中用得較少。 給定一門語言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。 下面用一個(gè)例子演示:將羅馬文字轉(zhuǎn)換為十進(jìn)制的格式 解釋器基類 千位數(shù)

    2024年02月07日
    瀏覽(90)
  • Go和Java實(shí)現(xiàn)解釋器模式

    下面通過一個(gè)四則運(yùn)算來說明解釋器模式的使用。 解釋器模式提供了評估語言的語法或表達(dá)式的方式,它屬于行為型模式。這種模式實(shí)現(xiàn)了一個(gè)表達(dá)式接口,該接口 解釋一個(gè)特定的上下文。這種模式被用在 SQL 解析、符號處理引擎等。 意圖:給定一個(gè)語言,定義它的文法表

    2024年02月12日
    瀏覽(20)
  • 設(shè)計(jì)模式-解釋器設(shè)計(jì)模式

    解釋器模式(Interpreter Pattern)是一種行為型設(shè)計(jì)模式,它用于解釋一種語言或表達(dá)式的語法。該模式主要用于自定義語言解釋、查詢解析和規(guī)則引擎等領(lǐng)域。在解釋器模式中,我們定義了一個(gè)解釋器類,用于解釋和執(zhí)行特定語法規(guī)則的表達(dá)式。 在本篇博客中,我們將詳細(xì)介

    2024年02月09日
    瀏覽(997)
  • 設(shè)計(jì)模式:解釋器模式

    解釋器模式(Interpreter Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種語言的文法,并且定義了該語言中各個(gè)元素的解釋器。通過使用解釋器,可以解析和執(zhí)行特定的語言表達(dá)式。 解釋器模式的核心思想是將一個(gè)語言的文法表示為一個(gè)類的層次結(jié)構(gòu),并使用該類的實(shí)例來表示

    2024年02月07日
    瀏覽(91)
  • 設(shè)計(jì)模式——解釋器模式

    設(shè)計(jì)模式——解釋器模式

    更多內(nèi)容,前往IT-BLOG 在軟件開發(fā)中,會遇到有些問題多次重復(fù)出現(xiàn),而且有一定的相似性和規(guī)律性。如果將它們歸納成一種簡單的表達(dá)式(例如:正則表達(dá)式等),那么這些問題實(shí)例將是該表達(dá)式的一些句子,這樣就可以用 “編譯原理” 中的解釋器模式來實(shí)現(xiàn)。 【1】解釋

    2024年02月03日
    瀏覽(308)
  • 設(shè)計(jì)模式詳解-解釋器模式

    類型:行為型模式 實(shí)現(xiàn)原理:實(shí)現(xiàn)了一個(gè)表達(dá)式接口,該接口使用標(biāo)識來解釋語言中的句子 作用:給定一個(gè)語言,定義它的文法表示,并定義一個(gè)解釋器,這個(gè)解釋器來解釋。 主要解決:一些重復(fù)的固定文法分別創(chuàng)建解釋器會很麻煩 何時(shí)使用:某一種特定類型的問題發(fā)生的

    2024年02月12日
    瀏覽(90)
  • 設(shè)計(jì)模式(23)解釋器模式

    設(shè)計(jì)模式(23)解釋器模式

    一、介紹: 1、定義:解釋器(Interpreter)模式是一種對象的行為模式。給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子。 2、組成結(jié)構(gòu): (1)AbstractExpression(抽象表達(dá)式):約定解釋器的解釋操作,主要是一個(gè)interpret()方

    2024年02月06日
    瀏覽(99)
  • 解釋器設(shè)計(jì)模式

    解釋器設(shè)計(jì)模式

    解釋器設(shè)計(jì)模式(Interpreter Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種語言的文法,并建立一個(gè)解釋器來解釋該語言中的句子。這種模式通常用于需要解釋或執(zhí)行一種特定類型的語言的場景,例如編程語言的編譯器或解釋器、規(guī)則引擎系統(tǒng)等。 關(guān)鍵組成部分 抽象表達(dá)式(

    2024年02月21日
    瀏覽(93)
  • 設(shè)計(jì)模式(行為型模式)解釋器模式

    ?? 解釋器模式(Interpreter Pattern) 是一種行為設(shè)計(jì)模式,用于解釋特定語言或處理特定問題領(lǐng)域的語法或表達(dá)式。它定義了一種語言的語法表示,并使用該表示來解釋語言中的句子。通常用于構(gòu)建解析器、編譯器和規(guī)則評估引擎等場景。 在解釋器模式中,有以下關(guān)鍵角色:

    2024年02月20日
    瀏覽(96)
  • 設(shè)計(jì)模式之解釋器模式筆記

    設(shè)計(jì)模式之解釋器模式筆記

    記錄下學(xué)習(xí)設(shè)計(jì)模式-解釋器模式的寫法。JDK使用版本為1.8版本。 意圖 :定義一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子。 結(jié)構(gòu) : 其中: AbstractExpression 聲明一個(gè)程序的解釋操作,這個(gè)接口為抽象語法樹中所有的結(jié)點(diǎn)所

    2024年02月11日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包