Я использую 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".
Как вы проходите такое дерево, чтобы генерировать правильное и действующее?Или есть способ создать дерево в желаемой форме?
Правка: вот определение грамматики (частичное).Я взял его из ExpressionEvaluatorGrammer, который поставляется с Irony.interpreter.
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("+") | "-" | "*" | "/" | "**" | "==" | "<" | "<=" | ">" | ">=" | "!=" | "&&" | "||" | "&" | "|";