デザインパターン(interpreter)に関する質問です。
interpreter パターンの Expression#interpret() って、
どんな役割を持つ関数なんでしょうか?
interpreter パターンについて扱った文献をいくつか読んでみたところ、
いろいろ違いがあって、混乱してます。

まず、文字列を読み込んで処理する過程がざっとこんな感じだと思うんですが

1. ある文法に則った文字列を読み込む
2. 文字列を解析して、構文木に変換する
3. 変換された構文木の各ノードに対して、共通のAPIを再帰的に適用する

例A:
「(A or B) and C」のような式を評価してその論理値を得る、という場合
Expression#interpret() は、その式の論理値を返します。
これは、interpret() が 3. の処理で使われています。

例B:
結城浩さんの「デザインパターン入門」では、Expression#interpret() は
文字列から構文木を構築するための手段として使われています。
これは、上の流れで言えば 2. の処理だといえます。

本来(GoFの狙い)はどうなんでしょうか?個人的には3.だと思うんですけど・・・