Location : Home > Languages > Perl > Package
Title : Math::Expr
Toolbox Logo

名称

 Math::Expr - 数式のパース


概要

use Math::Expr;

SetOppDB(new Math::Expr::OpperationDB(''));
$e=Parse("a+4*b-d/log(s)+f(d,e)");

説明

 数式をツリー構造にパースする。式は整数・実数・英数字による変数名・英数字による関数名・演算子として用いるその他の文字を含む。演算子は1文字以上であってもよい。
 唯一の制限は、変数名または関数名は数字で始まってはならないことで、全ての文字が演算子として受け付けられるわけではないということである。正確には文法の問題である(perl の正規表現記法で書くと以下のとおり)。

<Expr> = -?<Elem>(<OpChr><Elem>)*
<Elem> = <Number>|<Var>|<Function>Expr>\)
<Number> = <Integer>|<Float>
<Integer> = \d+
<Float> = \d*\.\d+
<Var> = [a-zA-Z][a-zA-Z0-9]*(:[a-zA-Z][a-zA-Z0-9]*)?
<Function> = [a-zA-Z][a-zA-Z0-9]*\(<Expr>(,<Expr>)*\)
<OpChr> = [^a-zA-Z0-9\(\)\,\.\:]+

 もし - 記号が <Expr> の最初に現れれば、neg() 関数がそれに置き換わる。すなわち "-a*b" や "b+3*(-7)" のような式のコンストラクトも可能である。
 変数は ':' で分割された2つの部分からなる。前の部分は変数名で、後ろの部分は(オプションで)型を示す。デフォルトは実数である。


メソッド

$e=Parse($str)

 これは文字列 $str をパースし、Math::Expr::Opp オブジェクトの形態で表現木を返す。(Math::Expr::Var または Math::Expr::Num オブジェクトのみの場合もある。)

$p = new Math::Expr

 これはコンストラクタで、文字列をパースするために用いられるオブジェクトを生成する。

Priority({'^'=>50, '/'=>40, '*'=>30, '-'=>20, '+'=>10})

 これは全ての被演算子の優先順位を指定する。(現在ではこれを変更する方法はない。)
 優先順位はデリミタなしでリストされた被演算子をどの順番でコンストラクトするかを決定する。例えばf a+b*c とあった際に (a+b)*c とするか a+(b*c) とするかを決定する。(デフォルトでは前者)
 優先順位はあらゆるパーサ・式に影響を与える。この変更は他の全てのパーサ・パース化されたオブジェクトにも影響を与える。
 本メソッドの理想は使用する前にシステムを初期化するために使うことである。

SetOppDB($db)

 OpperationDB を $db に設定する。詳しくは Math::Expr::OpperationDB を見よ。
 これは全てのパーサ・パース化された構造に影響を与えるグローバル変数である。


バグ

 変な文字列に対してはパースはうまく扱えない。もし上記で指定した記法に沿っていない文字列をパースしようとするとどんな奇妙なことが起こるかわからない。


著者

 Hakan Ardo, <hakan@debian.org>


参考資料

 Math::Expr::Opp

Toolbox Logo
Updated : 2008/10/28