我被要求使用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 + Recursive Builder构建了我的树,它识别输入并构建树而没有任何问题。
但问题是:如何将解释器应用于我的结构?
这是我的类图(有些是意大利语,但很容易理解)
如果我做对了,Interpreter会为每个语法规则使用一个类,所以我必须创建一个cond类,然后是一个termb,等等。
但是我如何将它们链接到我的复合材料?