= [[ProjectName]] [[RepositoryInfo]] [[ProjectDescription]] ユーザから [[BR]]'''「自動計算させたい。」''' [[BR]]という要望はシステムにつきものです。 [[BR]]お約束として細かい条件を聞き出し、起こりうるパターンを確定し、 [[BR]]'''「この時、このルールに従って計算する。」''' [[BR]]という定義をおこないます。 [[BR]] [[BR]]このとき、 [[BR]]'''「自分で計算式を編集したい」''' [[BR]]という要望が出た場合、多くのシステム屋は [[BR]]'''”見た目だけはいいけど作るのも操作するのも手間がかかりすぎるフォーム"''' [[BR]]を用意して、 [[BR]]'''"入力内容そっくりそのままな(DB上の)テーブルに格納する"''' [[BR]]と言う事をやりがちです。ほぼ必ずやります。 [[BR]]その後、時間がたっていざリリースという段階で [[BR]]'''"なんでコレできないの?"''' [[BR]]'''"こういう入力できないの?"''' [[BR]]と言う話になって自分で定義したテーブル構造に引っ張られて出来ないことが噴出、苦し紛れの言い訳に終始したり制限事項が頻発します。 [[BR]] [[BR]]式なんてわざわざドロップダウンから演算子選んで~なんて手間をかけさせずにテキストで書いてもらえばいいんです。 [[BR]]このプログラムは数式を解釈実行するためのライブラリです。 == プログラムの想定シナリオ 基本的に「自由に設定ができる」「実際の使用者がExcelの数式程度なら理解出来ている」という要件がついたときのシナリオです。 [[BR]]・入力内容に応じて自動計算 [[BR]] 例)身長・体重入力時にBMIを自動計算する。 [[BR]]・入力フォームの入力間違いを論理演算などで大まかにチェックする [[BR]] 例)一桁間違えた・あっちの項目に入力されてるのにこっちが入力されていない [[BR]]・複雑な検索条件を解釈する == プログラムの概要 このプログラムは某表計算ソフト風の一行スクリプトを実装するためのライブラリです。 [[BR]](工夫次第でそれ以上も出来ますがそれ以上はほかの言語を覚えるなり処理系を外部PGに丸投げした方が早いです。) [[BR]]DLLをリンクして外部PGから利用する事を想定しており、'''単体で何かが出来ると言う類のプログラムではありません。''' [[BR]]このプログラムは大きく4つ、 [[BR]]・式のパーサーとそれに関連するAPI(DLL) [[BR]]・サンプル演算子(DLL) [[BR]]・サンプルメソッド(DLL) [[BR]]・簡易デバッガ(EXE) [[BR]]からなります。 [[BR]]簡易デバッガがついてますがコレはAPIの使い方サンプルです。 [[BR]]サンプルに含まれる数値は基本的にDecimalで計算されます(一部Double化される物があります)。 [[BR]]サンプル演算子・関数は一部を除き某表計算ソフトの動作を基準にしてます。ただしセルという考え方はないのでvlookup等は実装されてません。セルの代わりに変数入力となります。 == プログラムの作り [[BR]]このプログラムはデザインパターン:Interpreterをベースにしています。 [[BR]]大きく以下のステップで動作します。 [[BR]]1.式を予約語単位に分解する(FormulaReader) [[BR]]2.ダブルクォートやエスケープ文字を解釈する(BlockReader) [[BR]]3.頭から順番に内容から構文木を作製する(FormulaParser) [[BR]]4.作られた構文木を演算子の優先順位に従って組み替える(PriorityChangeVisitor) [[BR]]5.場合によっては構文木に登場する変数ノードを抽出・設定する(VariableManager) [[BR]]5.結果を得る。(INode.eval()) [[BR]]また、(4までで作製した構文木を一個一個ぶちこわす事で)ステップ実行も可能です。 == プログラムの用語 ノード:構文木を構成する一つ一つの要素。演算子、メソッド、変数、文字列等からなる。 [[BR]]演算子:+-×÷等。自らの左右のノードを元に結果を返す。 [[BR]]メソッド:if/trunc等。自らの後ろいくつかのノードを元に結果を返す。 [[Embed(osdn_formula_160124.png)]] == リリースファイル (Release Files) [[ReleaseList]] == 最近のコミット (Recent Commits) [[RecentCommit]] [[RepositoryReadme]] == 最近更新されたチケット (Latest updated Tickets) [[RecentTickets(limit=5)]] = 作業部屋 Wiki について OSDN Wiki システムへようこそ。ここは作業部屋用の Wiki ページです。 ほぼプロジェクトと同じ機能が使えます。書式などに関しては、[wiki:docs:WikiGuide Wikiガイド]を参照して下さい。 = About Chamber Wiki Welcome to OSDN Wiki system. Here is your chamber Wiki space. Check [wiki:docs-en:WikiGuide Wiki Guide (English)] to refer syntax and functions.