Frequently used words (click to add to your profile)

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

最近の作業部屋活動履歴

2017-04-19
2017-04-08
2016-09-11
2016-06-29
2016-06-28

最近のWikiの更新 (Recent Changes)

2016-09-11

Wikiガイド(Guide)

サイドバー (Side Bar)

Formula

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

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

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

このとき、
「自分で計算式を編集したい」
という要望が出た場合、多くのシステム屋は
”見た目だけはいいけど作るのも操作するのも手間がかかりすぎるフォーム"
を用意して、
"入力内容そっくりそのままな(DB上の)テーブルに格納する"
と言う事をやりがちです。ほぼ必ずやります。
その後、時間がたっていざリリースという段階で
"なんでコレできないの?"
"こういう入力できないの?"
と言う話になって自分で定義したテーブル構造に引っ張られて出来ないことが噴出、苦し紛れの言い訳に終始したり制限事項が頻発します。

式なんてわざわざドロップダウンから演算子選んで~なんて手間をかけさせずにテキストで書いてもらえばいいんです。
このプログラムは数式を解釈実行するためのライブラリです。

プログラムの想定シナリオ

基本的に「自由に設定ができる」「実際の使用者がExcelの数式程度なら理解出来ている」という要件がついたときのシナリオです。
・入力内容に応じて自動計算
 例)身長・体重入力時にBMIを自動計算する。
・入力フォームの入力間違いを論理演算などで大まかにチェックする
 例)一桁間違えた・あっちの項目に入力されてるのにこっちが入力されていない
・複雑な検索条件を解釈する

プログラムの概要

このプログラムは某表計算ソフト風の一行スクリプトを実装するためのライブラリです。
(工夫次第でそれ以上も出来ますがそれ以上はほかの言語を覚えるなり処理系を外部PGに丸投げした方が早いです。)
DLLをリンクして外部PGから利用する事を想定しており、単体で何かが出来ると言う類のプログラムではありません。
このプログラムは大きく4つ、
・式のパーサーとそれに関連するAPI(DLL)
・サンプル演算子(DLL)
・サンプルメソッド(DLL)
・簡易デバッガ(EXE)
からなります。
簡易デバッガがついてますがコレはAPIの使い方サンプルです。
サンプルに含まれる数値は基本的にDecimalで計算されます(一部Double化される物があります)。
サンプル演算子・関数は一部を除き某表計算ソフトの動作を基準にしてます。ただしセルという考え方はないのでvlookup等は実装されてません。セルの代わりに変数入力となります。

プログラムの作り


このプログラムはデザインパターン:Interpreterをベースにしています。
大きく以下のステップで動作します。
1.式を予約語単位に分解する(FormulaReader)
2.ダブルクォートやエスケープ文字を解釈する(BlockReader)
3.頭から順番に内容から構文木を作製する(FormulaParser)
4.作られた構文木を演算子の優先順位に従って組み替える(PriorityChangeVisitor)
5.場合によっては構文木に登場する変数ノードを抽出・設定する(VariableManager)
5.結果を得る。(INode.eval())
また、(4までで作製した構文木を一個一個ぶちこわす事で)ステップ実行も可能です。

プログラムの用語

ノード:構文木を構成する一つ一つの要素。演算子、メソッド、変数、文字列等からなる。
演算子:+-×÷等。自らの左右のノードを元に結果を返す。
メソッド:if/trunc等。自らの後ろいくつかのノードを元に結果を返す。

osdn_formula_160124.png

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

檔案名大小時間下載總數
FormulaDebugger_20160123.zip139.28 k2016-01-23 20:31:5250

最近のコミット (Recent Commits)

修訂.時間作者訊息 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.