Location : Home > Languages > Perl > Package Title : Math::SymbolicX::ParserExtensionFactory |
![]() |
Math::SymbolicX::ParserExtensionFactory - Math::Symbolic のパーサ拡張の生成
use Math::Symbolic qw/parse_from_string/; use Math::SymbolicX::ParserExtensionFactory ( functionname => sub { my $argumentstring = shift; my $result = construct_some_math_symbolic_tree( $argumentstring ); return $result; }, anotherfunction => sub { ... }, ); # ... # その後にユーザコード my $formula = parse_from_string('variable * 4 * functionname(someargument)'); # Math::Symbolic オブジェクトとして $formula を使う。 # 例えば、Math::SymbolicX::BigNum (Math::Big* モジュールを利用して任意の精度の計算をサポートする) # または Math::SymbolicX::ComplexNumbers (複素数サポート)を参照のこと。
本モジュールは、妥当な Math::Symbolic ツリーを返す任意の関数を扱う Math::Symbolic パーサの拡張を提供する。
関数の返り値は関数呼び出しが行われた時点における完全なパースツリーに挿入される。Math::Symbolic モジュールとの親和性はドキュメント中に説明している。
本モジュールはオブジェクト指向ではない。何もエクスポートしない。いかなるサブルーチンも直接呼び出すべきではないし、いかなるクラスデータも直接編集すべきでもない。完全なインタフェースは Math::SymbolicX::ParserExtensionFactory 及びその引数を利用するために呼び出される。長いモジュール名の理由はパーサを永久に変更してしまうため、複数回呼び出すべきではないからである。タイプするのはちょっと苦痛だが。 :-)
モジュールの目的は、パーサを修正するにはモジュールコードに関する深い知識を必要とするのでパーサ自身を変更せずにパーサへフックをかけることを許すことである。関数名と関数実装(コード参照)に対する key => value の対を本モジュールの use() 呼び出しで特定することで、本モジュールは $Math::Symbolic::Parser 変数に特定の関数と格納されているパーサを拡張し、関数( \ を含まない文字列引数) がコード内で見つかるといつでもサブルーチン参照は引数として文字列を呼び出す。
サブルーチン Math::Symbolic ツリーが返されることが期待される。すなわち、version 0.133 では、Math::Symbolic::Operator, Math::Symbolic::Variable, Math::Symbolic::Constant オブジェクトのことである。返されたオブジェクトはカスタム関数がパースされたまさにその位置でパースから帰された結果を意味する Math::Symbolic ツリーに組み込まれる。
Please note that 本モジュールの使用はコード内で最初に使用した時点で完全な Math::Symbolic パーサを生成するので、コンパイル時には遅い。しかし実行時にはこのペナルティは小さい。
本モジュールは実行時にパース速度に影響を与えないように実装しているのでさほど柔軟でない。拡張は前処理されたものではなく実際の引数となる文字列を取得する。式は正規表現として扱うことを前提にしているので対応した括弧を内包した式を正しくパースできない。 詳しくは perldoc -q nesting で確認すること。
例えば foo(bar(1)) 最初の括弧まで foo 呼び出しの照合を行う。内側の括弧は次のように書けばエスケープできる:foo(bar(1\))。現段階ではエスケープキャラクタ ('\') をエスケープすることはできない。これはいくらか簡単な正規表現である。
エスケープの処理を行いながら括弧をパースするように実装することは困難なことではないが、これを単一の式で記述することはほとんど不可能である。
Copyright (C) 2003-2005 Steffen Mueller
本ライブラリはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布できる。
著者には symbolic-module at steffen-mueller dot net でコンタクトできる。
フィードバック・バグ報告・サポート要請は Math::Symbolic サポートメーリングリスト math-symbolic-support at lists dot sourceforge dot net にメールを送ってほしい。その際にはどのように Math::Symbolic を使っているか教えてほしい。
もしモジュールの機能開発や機能拡張に興味を持っているのなら、開発者メーリングリスト math-symbolic-develop at lists dot sourceforge dot net に連絡してほしい。
本モジュールの新しいバージョンは http://steffen-mueller.net または CPAN で見つけることができる。
Math::Symbolic, Math::Symbolic::Parser も参照のこと。
Math::SymbolicX::BigNum (Math::Big* モジュールを利用して任意の精度の計算をサポートする) または Math::SymbolicX::ComplexNumbers (複素数サポート)を参照のこと。
![]() |
Updated : 2006/12/18 |