c# - 遍历具有复杂条件表达式的 ast 以生成 linq 表达式

标签 c# parsing abstract-syntax-tree irony

我正在使用 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("+") | "-" | "*" | "/" | "**" | "==" | "<" | "<=" | ">" | ">=" | "!=" | "&&" | "||" | "&" | "|";

最佳答案

您无法通过以神奇/特殊的方式遍历树来解决此问题。您的解析器不正确!可能只是配置错误。您绝对需要从中获取正确的树,以便进一步处理它。

可能您在其中使用了错误的运算符优先级规则。至少看起来像。尝试添加括号以查看它是否修复了树。

关于c# - 遍历具有复杂条件表达式的 ast 以生成 linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046584/

相关文章:

c# - 如何在 WPF 的 Combobox 中有效地添加多个项目

C# 方法调用者

c# - Xamarin 形式 : tooltip in windows app

python - 使用 BeautifulSoup 更改元素值返回空元素

java - cup_v10k AST 无法识别 boolean 值

dynamic - 如何在 Groovy 中为现有 Java 类动态添加接口(interface)

c# - 在 C# 中获取图形的 Y 值

java - 在 JSON 对象中解析 JSON 数组

parsing - 删除基本表达式解析器中的左递归

java - 为什么我的 AST TypeDeclaration 缺少其方法和字段?