Меня попросили сделать оценщика выражений, используя 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 использует композитную структуру, поэтому было бы неплохо расширить мою структуру Composite с помощью метода оценки (: Контекст).
Я спросил, но мне сказали, что это не способ выполнить задание. Похоже, что у меня построено дерево интерпретаторов, начиная с Composite (что для меня совершенно бессмысленно, поскольку у меня уже есть дерево для работы!).
Итак, я построил свое дерево с помощью Composite + Recursive Builder, он распознает вход и строит дерево без каких-либо проблем.
Но возникает вопрос: как применить интерпретатор к моей структуре?
Здесь моя диаграмма классов (что-то итальянское, но это вполне понятно)
Если я правильно понял, Interpreter использует класс для каждого правила грамматики, поэтому мне нужно сделать cond-класс, затем termb и т.д.
Но я привязываю их к своему композиту?