• Showing Page History #103437
  • Showing Page History #103663

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Formula

  • R/O
  • R/O (HTTP)
  • R/W (SSH)
  • R/W (HTTPS)
Fork

簡易言語実装の為のライブラリ

ユーザから
「自動計算させたい。」
なんていう要望を受けたとき、業務システム屋はお約束として細かい条件を聞き出し、起こりうるパターンを確定し、
「この時、このルールに従って計算する。」
なんて定義をよくやります。

このとき、
「自分で計算式を編集したい」
なんて要望が出たら業務システム屋は
”見た目はいいけど作るのも操作するのも超めんどくさいフォーム"
を用意して、
"入力内容そっくりそのままな(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等。自らの後ろいくつかのノードを元に結果を返す。

osdn_formula_150801.jpg

リリースファイル (Release Files)

FilenameSizeTimeDownload count
FormulaDebugger_20160123.zip139.28 k2016-01-23 20:31:5249

最近のコミット (Recent Commits)

Rev.TimeAuthorMessage RSS
4407f9302017-04-19 22:54:18s_horimoto発生したエラーがうやむやになりやすいため内容を連結
48e813312017-04-08 10:44:57s_horimotoデバッガでステップ実行時、「,」の処理ができていなかった不...
5a744f842016-06-29 00:30:39s_horimotoノード関連のコメント拡充
178540212016-06-28 01:17:30s_horimotoInnerMethodOptimizer使用後の注意事項を追加
6d4faee22016-06-26 07:35:09s_horimotoオプティマイザ(自動関数化による計算量削減)を試験実装
5795452a2016-03-03 21:50:54s_horimotoキャッシュを利用した高速化ルーチンを実装
eb2ec9722016-03-02 11:15:41s_horimotoシンタックスハイライトの処理を「タイマー動作」と「常時(=...
723c8f102016-01-31 18:36:22s_horimoto説明を追加 日付関数のテスト追加
9c61e4232016-01-31 12:33:42s_horimoto日付関連の関数を追加
8c95a0612016-01-24 05:10:17s_horimoto日付変数とそれに関連する関数を部分的に実装

最近更新されたチケット (Latest updated Tickets)

No tickets

作業部屋 Wiki について

OSDN Wiki システムへようこそ。ここは作業部屋用の Wiki ページです。

ほぼプロジェクトと同じ機能が使えます。書式などに関しては、Wikiガイドを参照して下さい。

About Chamber Wiki

Welcome to OSDN Wiki system. Here is your chamber Wiki space.

Check Wiki Guide (English) to refer syntax and functions.