設計模式19 直譯器模式

2021-09-27 04:09:54 字數 2967 閱讀 5844

大資料統計專案遇到的問題:

按照計算模型對現有資料統計、分析、**

一般的計算模型是乙個或多個運算公式,通常是加減乘除四則運算

計算模型需要執行期編輯

設計方案要有高擴充套件性

計算模型按正常算術方式書寫,直譯器處理語法邏輯

計算模型裡有兩類符號:資料和計算符

用逆波蘭演算法分析算式語法

用直譯器模式處理資料

[外鏈轉存失敗(img-xpybo3hh-1568648786773)(

- cls 該包為各種逆波蘭之後的各種計算方式

- - abstractexpresstion 抽象類,所有的超類(hashmap為一列資料)

- - - varexpresstion 終結表示式(變數表示式)

- - - symbolexpresstion 非終結表示式(符號表示式,抽象類)

- - - - addexpresstion 加

- - - - subexpresstion 減

- - - - multiexpresstion 乘

- - - - divexpresstion 除

public abstract class abstractexpresstion

public class varexpresstion extends abstractexpresstion

@override

public float interpreter(hashmapvar)

}public abstract class symbolexpresstion extends abstractexpresstion

}public class addexpresstion extends symbolexpresstion

@override

public float interpreter(hashmapvar)

}public class subexpresstion extends symbolexpresstion

@override

public float interpreter(hashmapvar)

}public class multiexpresstion extends symbolexpresstion

@override

public float interpreter(hashmapvar)

}public class divexpresstion extends symbolexpresstion

@override

public float interpreter(hashmapvar)

}public class rpn

} // 將中序表示式轉換為右序表示式

private void toright() else

} else

astack.push(expression.get(position));}}

} else

right.add(expression.get(position));

position++;

if (position >= expression.size())

break;

} while (astack.top != -1)

} // 對右序表示式進行求值

public void getresult(hashmapvar) else

stack.push(new varexpresstion(is));

} result = stack.pop();

it = expression.iterator();

while (it.hasnext())

system.out.println("=" + result.interpreter(var));

} public static class calculate

// 設定操作符號的優先級別

public static int priority(string operator)

// 做2值之間的計算

public static abstractexpresstion tworesult(string op,

abstractexpresstion a, abstractexpresstion b) catch (numberformatexception e)

} }// 棧類

public class stacks

public object pop()

public object top()

}}

public class calculator 

system.out.println(";");

} try

}system.out.println("input another expression or input 'q' to quit:");

}is.close();

} catch (ioexception e) }}

public class interpretertest

}

執行test類後在控制台輸入:a、b、c、d、e、f為變數的包含可以±*/()的運算公式,然後回車得出結果.

直譯器模式定義乙個語法, 定義乙個直譯器,該直譯器處理該語法句子

將某些複雜問題,表達為某種語法規則,然後構建直譯器來解釋處理這類句子

[外鏈轉存失敗(img-5jgdlcbq-1568648786775)(

缺點:

盡量不要在重要的模組中使用直譯器模式

直譯器模式在實際的系統開發中使用的非常少

可以考慮一下expression4j、mesp、jep等開源的解析工具包

當你有乙個簡單語法,而且效率不是問題的時候

一些資料分析工具、報表設計工具、科學計算工具等

設計模式從入門到精通 19 直譯器模式

目錄通過直譯器模式來實現四則運算,如計算a b c的值,具體要求 傳統方案解決四則運算問題分析 4 這樣的例子還有,比如編譯器 運算表示式計算 正規表示式 機械人等 原理類圖 直譯器模式的角色及職責 uml 類圖 核心 抽象表示式 抽象表示式類 public abstract class expre...

設計模式 直譯器模式

未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。但...

設計模式 直譯器模式

直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。當有乙個語言需要解釋執行,並...