我正在使用Irony.net生成源代碼之外的解析樹。基本上,我使用ExpressionEvaluatorGrammer就像二進制表達式(算術,關係和邏輯/條件)的語法。我想通過遍歷它將生成的分析樹轉換爲Linq表達式。但是,樹似乎沒有可以直接轉換爲linq條件表達式的格式。這種表達的假設的例子:遍歷具有複雜條件表達式的ast來生成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("+") | "-" | "*" | "/" | "**" | "==" | "<" | "<=" | ">" | ">=" | "!=" | "&&" | "||" | "&" | "|";
我不知道Irony.Net但它生成的xml對應於((1 == 1)&&(4 * 1))== 3。無論是&&和==具有相同的優先級,而*具有更高的優先級或它是一個錯誤。您可能會嘗試在解析之前添加paranthesis,或使用其他工具。如果實際的語法不復雜得多,手動編寫解析器(直接生成表達式)應該不會很困難。 – 2012-01-28 16:16:33
你對'RegisterOperators'的看法是什麼樣子?你如何設置關聯性? – user7116 2012-01-28 16:35:25
@sixlettervariables請參閱具有優先級的語法 – 2012-01-28 16:50:32