Edited at

Javascriptで逆ポーランド記法の式生成と計算


概要

Javascriptで実装した逆ポーランド記法の式生成および計算ライブラリです。

MDNの演算子の優先順位に則った、評価順および結合法則となっています。

中置記法(一般的な数式の記法)から逆ポーランド記法(演算子を後ろに置く記法。後置記法)への変換、逆ポーランド記法の計算を行います。

また関数として解釈する文字列とその演算機能を動的に定義できます。


GitHub

ReversePolishNotation


デモ

数式の逆ポーランド記法コンバートと計算実行デモ


機能

globalにrpnというオブジェクトを追加。

rpn -> function (string):逆ポーランド記法の式評価(計算)

rpn.Generate -> function (string):中置記法から逆ポーランド記法の式を生成

rpn.SetOperate -> function (string, number, function):関数の定義


使用できる演算子

+ - * / ** % << >> ~ & ^ |


使用例


1. 逆ポーランド記法の式生成

rpn( 中置記法の式 )

rpn.Generate("2*(5 + 7)");

// => 2 5 7 + *

//# 累乗を含む計算式
rpn.Generate("4 ** 3 ** 2");
// => 4 3 2 ** **

//# 16進法が扱えます
//# マイナス符号は '_' に変換します(プラス符号は '#' に変換)
rpn.Generate("~-5*4**(0x0f - 12)**2");
// => 5 _ ~ 4 15 12 - 2 ** ** *


2. 逆ポーランド記法の式計算

rpn( 逆ポーランド記法の式 )

rpn("2 5 7 + *");

// => 24

//# 累乗は右から左に計算します
rpn("4 3 2 ** **");
// => 262144

rpn("5_~4 0x0f 12-2** ** *");
// => 1048576


3. 演算機能(関数)の追加

rpn.SetOperate( 関数名, 引数の数, 関数本体 )

戻り値は rpn なのでメソッドチェーンが可能。

//# chain method available

//# 正弦関数と余弦関数を定義
rpn.SetOperate("sin", 1, function(arg1){ return Math.sin(arg1*(Math.PI/180)); })
.SetOperate("cos", 1, function(arg1){ return Math.cos(arg1*(Math.PI/180)); });

//# 実行例
rpn.Generate("sin(45 + 45)");
// => 45 45 + sin
rpn("45 45 + sin");
// => 1