Использование шаблона интерпретатора в составной структуре

Меня попросили создать оценщик выражений с использованием 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 “!”

Назначение:

The goal of the project, based on Composite, Recursive Builder and Interpreter, is to get a conditional expression, do a syntax analysis and build its composite tree. Starting from the tree, you've got to evaluate the result of the condition, based on an external context (read from a properties file) that contains the value of the internal variables

Итак, первое, что я заметил, это то, что Interpreter использует структуру Composite , поэтому мне показалось хорошей идеей расширить мою структуру Composite с помощью оценить (:контекст)метод.

Я поспрашивал, но мне сказали, что это не способ выполнить задание. Похоже, я построил дерево Interpreter , начиная с Composite и (, что для меня совершенно бессмысленно, так как у меня уже есть дерево для работы! ).

Итак, я построил свое дерево, используя Composite + Recursive Builder , он распознает ввод и строит дерево без каких-либо проблем.

Но возникает вопрос :, как мне применить Interpreter к моей структуре?

Вот моя диаграмма классов (что-то итальянское, но вполне понятное)

Composite+Builder class diagram

Если я правильно понял, Интерпретатор использует класс для каждого правила грамматики,поэтому я должен создать класс cond , затем termb и так далее.

Но как мне связать их с моей композицией?

10
задан Dave Schweisguth 13 February 2016 в 12:57
поделиться