我正在使用 Irony.net 从源代码中生成解析树。本质上,我将 ExpressionEvaluatorGrammer 类似于 grammer 用于二进制表达式(算术、关系和逻辑/条件)。我想通过遍历将生成的解析树转换为 Linq 表达式。但是,这棵树似乎没有可以直接转换为 linq 条件表达式的格式。这种表达式的假设示例:
1 == 1 && 4 - 1 == 3
生成(为简洁起见,伪 xml 树):
<binary>
<binary>
<binary>
<literal>1</literal>
<op>==</op>
<literal>1</literal>
</binary>
<op>&&</op>
<binary>
<literal>4</literal>
<op>-</op>
<literal>1</literal>
</binary>
</binary>
<op>==</op>
<literal>3</literal>
</binary>
在上面的树中,算术表达式 (4 - 1) 成为 && 逻辑运算的正确表达式,因为父节点在它之后关闭。在理想世界中,它应该是代表“== 3”的节点的左表达式。
您如何遍历这样的树以生成正确的和操作?或者,有没有办法以我想要的形式生成树?
编辑:这是语法(部分)定义。我取自 Irony.interpreter 附带的 ExpressionEvaluatorGrammer。
RegisterOperators(15, "&", "&&", "|", "||");
RegisterOperators(20, "==", "<", "<=", ">", ">=", "!=");
RegisterOperators(30, "+", "-");
RegisterOperators(40, "*", "/");
Expr.Rule = Term
Term.Rule = number | ParExpr | stringLit | FunctionCall | identifier | MemberAccess | IndexedAccess;
ParExpr.Rule = "(" + Expr + ")";
BinExpr.Rule = Expr + BinOp + Expr;
BinOp.Rule = ToTerm("+") | "-" | "*" | "/" | "**" | "==" | "<" | "<=" | ">" | ">=" | "!=" | "&&" | "||" | "&" | "|";