簡易言語実装の為のライブラリ
ユーザから
「自動計算させたい。」
なんていう要望を受けたとき、業務システム屋はお約束として細かい条件を聞き出し、起こりうるパターンを確定し、結局
「この時、このルールに従って計算する。」
なんて事をよくやります。
このとき、
「自分で計算式を編集したい」
なんて要望が出たら業務システム屋は
”見た目はいいけど作るのも操作するのも超めんどくさいフォーム"
を用意して、
"入力内容そっくりそのままな(DB上の)テーブルに格納する"
と言う事をやりがちです。というかほぼ必ずやります。で、時間がたっていざリリースという段階で
"なんでコレできないの?"
こういう入力できないの?
と言う話になって自分が作ったテーブル構造に引っ張られて自爆します。
式なんてわざわざドロップダウンから演算子選んでなんてやらずにテキストで書いてもらえばいいんです。
このプログラムは式を解釈実行するためのライブラリです。
基本的に「自由に設定ができる」という要件がついたときのシナリオです。
・入力内容に応じて自動計算
例)身長・体重入力時にBMIを自動計算する。
・入力フォームの入力間違いを大まかにチェックする論理演算でチェックする
例)一桁間違えた・あっちの項目に入力されてるのにこっちが入力されていない
・複雑な検索条件を解釈する
このプログラムは一行スクリプトを実装するためのライブラリです。
DLLをリンクして使用する事を想定しており、単体で何かが出来ると言う類のプログラムではありません。
このプログラムは大きく4つ、
・式のパーサーとそれに関連するAPI(DLL)
・サンプル演算子(DLL)
・サンプルメソッド(DLL)
・簡易デバッガ(EXE)
からなります。
簡易デバッガがついてますがコレはAPIの使い方サンプルです。
サンプル演算子、サンプルメソッドはExcel式っぽく実装してます。
サンプルに含まれる数値は基本的にDecimalで計算されます(一部Double化される物があります)。
このプログラムはデザインパターン:Interpreterをベースにしています。
大きく以下のステップで動作します。
1.式を予約語単位に分解する(FormulaReader)
2.ダブルクォートやエスケープ文字を解釈する(BlockReader)
3.頭から順番に内容から構文木を作製する(FormulaParser)
4.作られた構文木を演算子の優先順位に従って組み替える(PriorityChangeVisitor)
5.場合によっては構文木に登場する変数ノードを抽出・設定する(VariableManager)
5.結果を得る。(INode.eval())
また、(4までで作製した構文木を一個一個ぶちこわす事で)ステップ実行も可能です。
ノード:構文木を構成する一つ一つの要素。演算子、メソッド、変数、文字列等からなる。 演算子:+-×÷等。自らの左右のノードを元に結果を返す。 メソッド:if/trunc等。自らの後ろいくつかのノードを元に結果を返す。
| Filename | Size | Time | Download count |
| 139.28 k | 2016-01-23 20:31:52 | 49 |
| Rev. | Time | Author | Message RSS |
| 4407f930 | 2017-04-19 22:54:18 | s_horimoto | 発生したエラーがうやむやになりやすいため内容を連結 |
| 48e81331 | 2017-04-08 10:44:57 | s_horimoto | デバッガでステップ実行時、「,」の処理ができていなかった不... |
| 5a744f84 | 2016-06-29 00:30:39 | s_horimoto | ノード関連のコメント拡充 |
| 17854021 | 2016-06-28 01:17:30 | s_horimoto | InnerMethodOptimizer使用後の注意事項を追加 |
| 6d4faee2 | 2016-06-26 07:35:09 | s_horimoto | オプティマイザ(自動関数化による計算量削減)を試験実装 |
| 5795452a | 2016-03-03 21:50:54 | s_horimoto | キャッシュを利用した高速化ルーチンを実装 |
| eb2ec972 | 2016-03-02 11:15:41 | s_horimoto | シンタックスハイライトの処理を「タイマー動作」と「常時(=... |
| 723c8f10 | 2016-01-31 18:36:22 | s_horimoto | 説明を追加 日付関数のテスト追加 |
| 9c61e423 | 2016-01-31 12:33:42 | s_horimoto | 日付関連の関数を追加 |
| 8c95a061 | 2016-01-24 05:10:17 | s_horimoto | 日付変数とそれに関連する関数を部分的に実装 |
OSDN Wiki システムへようこそ。ここは作業部屋用の Wiki ページです。
ほぼプロジェクトと同じ機能が使えます。書式などに関しては、Wikiガイドを参照して下さい。
Welcome to OSDN Wiki system. Here is your chamber Wiki space.
Check Wiki Guide (English) to refer syntax and functions.