Parasol は,固定した文法を持たない構文解析ライブラリです. アプリケーションなどに適切な文法のスクリプト機能を持たせたい場合や,特殊な作業のための独自のインタプリタを作成したい場合などに便利に使えます. 完全にライブラリとして実装されており,コンパイラ以外の外部ツールや特定フォーマットの入力ファイルなどを必要としません. その一方で,演算子や文,組み込み関数・クラスなど,ほとんどの文法要素を独自に定義することができます. さらに,式パーザやトークナイザなどの単体利用も簡単にでき,実行時に入力された式の計算などにも利用することができます.
パーザを構成する言語要素(演算子,文,組み込み関数・クラス,実行エントリなど)をまとめて,言語ユニットを作成することができます. 言語ユニットは,別の言語ユニットをマージしたり,そこに新しい文法要素を追加したりすることができます. Parasol には,C言語で使われるほとんどの演算子や文を定義した言語ユニットも付属しており,それをベースにして独自のスクリプトを作成することもできます.
ただし,今のところ,型の扱いがちょっと弱いです.
作成には充分注意していますが,間違い等が含まれている可能性があります. 動作の保証はできませんので,御了承下さい. ライセンスは "LGPL Version 2.1" または "Modified BSD" とします. どちらか一方を選んで適用してください. LGPL2.1 の詳細については, COPYING-LGPL2.1 ファイル を,"Modified BSD" の詳細については COPYING-ModifiedBSD ファイル を参照してください.これらのファイルはソースコードに付属しています.
Parasol は,分散型汎用オンライン環境の構築を目指す KiNOKO プロジェクトの一部として作成されました. KiNOKO プロジェクトの詳細については, KiNOKO ホームページ を御覧下さい.
- Linux 2.2/2.4/2.6
- gcc 2.95 / 3.3 / 4.1
- Intel C++ Compiler 5.0.1
- AIX 4.3.3
- VisualAge C++ Version 5
- gcc 2.95
% gunzip parasol-?.?.?.tar.gz % tar xvf parasol-?.?.?.tar % cd parasol
% ./configure % make
あと,標準ライブラリ関数もありません (いくつかの「組み込みクラス/関数」はあります).
このディレクトリには,YACI のためのサンプルスクリプトがいくつかあります.これらは,Parasol 標準パーザの言語機能のテストおよびデモンストレーションのためのものです.以下は,それらの簡単な説明です.
hello.yaci は, 新しい言語を使い始めるときに,最初に書く決まりになっているプログラムです.実行すると,世界に挨拶をします.
% ./yaci hello.yaci hello, world.
factorial.yaci は, YACI が処理できるスクリプトのサンプルです.ここでは,0 から 9 までの整数の階乗を計算しています.言語機能を示すためのサンプルなので,冗長で一貫性がありませんが,関数の定義・呼び出しや,出力の方法などを示しています.
% ./yaci factorial.yaci 5! = 120 6! = 720 7! = 5040 : :
line-number.yaci も, YACI が処理できるスクリプトのサンプルです.引数に指定されたファイルを一行ずつ読み込み,行番号を付加して標準出力へ書き出します.言語機能のサンプルのため,出力部分で一文字ずつ表示していたりなど,冗長で遅いですが,文字列型やポインタの使用方法などを示しています.
% ./yaci line-number.yaci factorial.yaci 1: // factorial.yaci 2: // Created by Enomoto Sanshiro on 4 September 1999. 3: 4: int start_index = 5; 5: int stop_index = 2 * start_index + 1; : : :
dump.yaci は,書式化出力のサンプルです.実行すると標準入力を読んで,それを16進ダンプします.
% ./yaci dump.yaci < foo 0000 0000: 3f 8b 08 08 5e 17 ae 39 00 03 66 6f 6f 00 bc 5b 0000 0010: 0d 74 14 55 96 7e 81 a4 29 31 6a 80 8c e0 08 63 : : : :
matherror.yaci は,数学関数の使用とエラーハンドリング (try-catch文)のサンプルです.何の役にも立ちません.
array.yaci は,C 型の配列およびポインタのサンプルです.C型配列は構文にC言語と互換性があり,また,比較的高速に動作しますが,ユーザにメモリ管理の責任が生じます.通常は,以下のリスト型を使用した方がいいでしょう.
variant.yaci は,バリアント型および「特殊スコープへの変数生成とアクセスをする演算子(仮称)」$ のサンプルです.バリアント変数は,保持している値に応じて型が変わりますが,ちゃんと型付けされた変数です.型は,typeof() 演算子により知ることができます.$ 演算子は,多くのインタプリタにあるような,明示的な宣言なしで変数を使えるようにする特殊な演算子です.$名前 または ${名前の文字列式} によりこの変数を使用できます.型はバリアントで,スコープは,「$ 演算子により参照される変数のためのグローバルなスコープ(仮称)」になります.簡単に言えば,perl のような感じで使えます.
list.yaci は,Parasol 独自のプリミティブ型であるリスト型のサンプルです.リストとは,バリアント型の可変長配列のようなものですが,プリミティブ型として実装されているため,演算子や文など他の文法要素のサポートがあり,より便利に使えるようになっています.
listmath.yaci は,リスト型変数に対する算術演算のサンプルです.加減乗除や累乗などの算術演算および数学関数は,リスト型の変数に対しては,各要素への演算を行います.また,リスト型変数と非リスト型変数(スカラ変数)の混合演算も,スカラをリストに拡張して演算を行います.これらの振舞いは,特にベクトル計算やデータ解析などに便利です.
% ./solve "x**2 - 2" x[1] = 1.5 x[2] = 1.41667 x[3] = 1.41422 x[4] = 1.41421第2引数に計算の初期値を与えることができます.省略した場合の初期値は 1 です.
分散型汎用データ収集システム KiNOKO では,Parasol をベースにして SQL データベースアクセスや正規表現,低レベルシステムアクセスなどのインターフェースを追加したスクリプトを使用しています.詳細は,KiNOKO ホームページを参照してください(KiNOKO パッケージに含まれている Parasol ライブラリの方が最新の安定版です.このページの更新は最近ちょっと遅いです).