ヽ(*゚д゚)ノ<Interpreterパターン
12011/04/25
第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』2011年4月26日火曜日
ID:yuroyoroゆろよろ
2
お前、誰よ?
2011年4月26日火曜日
Interpreterパターンって
3
2011年4月26日火曜日
文字列などを構文規則に従って
字句毎にオブジェクトに変換して
実行する機能を持たせる
4
2011年4月26日火曜日
ようはミニ言語を
作るパターン
5
2011年4月26日火曜日
登場人物
Parser :
構文解析してExpression作る
Expression :
構文の要素を表す
要素に応じた振る舞いを持つ
6
2011年4月26日火曜日
例えば
7
2011年4月26日火曜日
プログラミング言語
ほむほむ
8
2011年4月26日火曜日
ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ ほむ9
2011年4月26日火曜日
プログラミング言語
A
と同じなので略
10
2011年4月26日火曜日
電卓だと
11
2011年4月26日火曜日
Parser
“1 + 2 * 3”
+
1 *
2 3
抽象構文木(AST)
Expression自体が計算する能力を
持つ
2011年4月26日火曜日
Expression
interface Expr {
int calc();
}
13
構文木の要素を表す
計算する処理
2011年4月26日火曜日
Expression
class Num implements Expr{
int n = 0;
public Num(int n) { this.n = n; }
public int calc(){ return this.n; }
}
14
数字の要素を表す
計算結果は単に数字を返す
2011年4月26日火曜日
Expression
class Add implements Expr{
Expr left ;
Expr right;
public Add(Expr l, Expr r) {
this.left = l; this.right = r;
}
public int calc(){
return left.calc() + right.calc();
}
}15
+の要素を表す
右辺と左辺(Expr型)
計算結果は右辺と左辺の結果を足す
2011年4月26日火曜日
Parserは、
自分で実装していいし
ライブラリ使ってもいい
(Parser Combinatorとか
LRとか)
16
2011年4月26日火曜日
Expressionは
木構造やLinkedListなど
自己再帰的な構造
17
2011年4月26日火曜日
たいていの場合
構文木はツリーになるので
Compositeパターンと似る
18
2011年4月26日火曜日
Expressionは自身が
計算能力を持つ
19
2011年4月26日火曜日
BNFで定義できるなら
機械的に書ける
20
2011年4月26日火曜日