Composite、Recursive Descendent Parser、およびInterpreterを使用して式評価器を作成するように依頼されました。
文法は次のとおりです。
<cond> → <termb> [OR <termb>]*
<termb>→<factb>[AND <factb>]*
<factb>→<expr> RELOP <expr> | NOT <factb> | OPAR <cond> CPAR
<expr> → [PLUS | MINUS] <term> [(PLUS <term>) | (MINUS <term>)]*
<term> → <termp> [(MULT <termp>) | (DIV <termp>) | (REM <termp>)]*
<termp> → <fact> [POWER <fact>]*
<fact> → ID | NUM | OPAR1 <expr> CPAR1
----TERMINALS----
ID → ("A" | ... | "Z" | "a" | ...| "z") [("A"| ... | "Z" | "a" | ...| "z" | "0" | ... | "9")]*
NUM → ("0" | ... | "9") [("0" | ... | "9")]*
OPAR → "("
CPAR → ")"
OPAR1 → "["
CPAR1 → "]"
RELOP → EQ | NEQ | GT | GE | LT | LE
EQ → "= ="
NEQ → "!="
GT → ">"
GE → ">="
LT → "<"
LE → "<="
POWER → "^"
DIV → "/"
REM → "%"
MULT → "*"
MINUS → "−"
PLUS → "+"
AND → “and” or “&&”
OR → “or” or “||”
NOT → “not” or “!”
割り当ては次のとおりです。
Composite、Recursive Builder、および Interpreter に基づくプロジェクトの目標は、条件式を取得し、構文解析を行い、複合ツリーを構築することです。ツリーから始めて、内部変数の値を含む外部コンテキスト (プロパティ ファイルから読み取られる) に基づいて、条件の結果を評価する必要があります。
さて、私が最初に気付いたのは、InterpreterがComposite構造を使用していることです。そのため、evaluate(:Context)メソッドを使用してComposite構造を拡張することをお勧めします。
周りに聞いてみたのですが、これは課題のやり方ではないと言われました。Compositeツリーから始めて、 Interpreterツリーを構築したようです(作業するツリーが既にあるので、これは私にとってはナンセンスです!)。
そのため、 Composite + Recursive Builderを使用してツリーを構築しました。入力を認識し、問題なくツリーを構築します。
しかし問題は、 Interpreterを自分の構造に適用するにはどうすればよいかということです。
これが私のクラス図です(イタリア語ですが、かなり理解できます)
うまくいけば、Interpreterは文法規則ごとにクラスを使用するので、condクラス、次にtermbなどを作成する必要があります。
しかし、それらをコンポジットにリンクするにはどうすればよいでしょうか?