ソースから解析ツリーを生成するために Irony.net を使用しています。基本的に、バイナリ式 (算術式、関係式、および論理/条件式) のグラマーのような ExpressionEvaluatorGrammer を使用しています。結果の解析ツリーをトラバースして 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("+") | "-" | "*" | "/" | "**" | "==" | "<" | "<=" | ">" | ">=" | "!=" | "&&" | "||" | "&" | "|";