概要 - narareimei/ParserSample GitHub Wiki
お仕事で表に計算式機能を持たせることに。 そのため簡単な式パーサを作ってみた。ネット上の皆様、ありがとう。
式の解析と評価のお試し。
- 四則演算 +-/*()
- 集合関数 ex)sum avg count stdevp
- 算術関数 ex)floor
- 条件関数 ex)lt gt eq ne
- 条件分岐 if( condition, [value_if_true], [value_if_false] )
ツリーの持ち方
- 関数の場合は持ち方が少し異なる
- 引数が1つのもの
- sum(1+2) --> 式:sum、左:1+2、右:なし
- 引数が2つのもの
- lt(1,2) --> 式:lt、左:1、右:2
- 引数が1つのもの
SUM(2,+3+4,-5)の場合のツリー。カッコ()は演算子を意味する。
(SUM)
|
+-+---+
| |
2 (,)
|
+-------+
| |
(+) (-)
+---+ +---+
| | | |
3 4 null 5
定数外の指定
- sum(column_a) とか (column_hight*column_width)のように、データのカラム名の指定も可能とする。
- 評価時には参照可能なデータ(DataRow、DataTable)を指定し、そこからカラム名で具体値を求める。
- sum()のような集合関数は、詳細テーブル相当である「DataTable」に対して評価を行う。