【问题标题】:How do I parse this type of expressions?如何解析这种类型的表达式?
【发布时间】:2013-07-29 18:42:50
【问题描述】:

我没有编译器背景,所以我不确定这在该领域是否常见。是否有任何标准技术来解析这样的表达式? (比如说,tab表示深度)

And
    A + B = 1
    C + D = 1
    Or
       P + Q = 1
       K = 1
    And
       Q = 1
       R = 2

应该被解析为:

((A+B=1) AND (C+D=1) AND ((P+Q=1) OR (K=1)) AND ((Q=1) AND (R=2)))

我不确定我是否应该诉诸基于堆栈的评估?我目前正在尝试一个,如果可以运行,我会发布一个工作代码。

对实现这一目标的简单方法有什么建议吗?

【问题讨论】:

  • 上下文是什么?它必须是“安全的”吗?或者你可以稍微改变你的语法并使用eval()或类似的Python吗?例如,((A+B==1) and (C+D==1)) 是 Python 语法。
  • 很遗憾,我无法更改输入。我正在解析一些 XML 文件并设法将表达式本身解析为字符串。我如何格式化字符串取决于我,但评估顺序和所有内容仍然需要注意。另外,我不想评估任何东西,只想说,获取一个用于打印的字符串。
  • 您是否将表达式解析为树?然后通过替换这些变量的数字来评估它们?
  • +1 提出了一个有趣的问题,但我有点困惑——你只是在问解析,还是关于如何进行评估?
  • @MattFenwick:对不起,我的意思是我现在不太关心评估表达式。我只是想获取输入的字符串表示形式。

标签: python parsing expression operator-precedence


【解决方案1】:

假设您正在询问如何解析由具有不同优先级和关联性的运算符构建的表达式 - 绝对如此。

一种有效的方法称为“自顶向下运算符优先级”,也可能是“运算符优先级”和“优先级攀升”解析。以下是一些很好的资源,详细解释了该方法:

真正巧妙的是它实际上只需要很少的代码。

关键概念是:

  • 前缀 vs 中缀 vs mixfix

  • 优先级:是3 + 4 * 5解析为(3 + 4) * 5还是3 + (4 * 5)

  • 关联性:x - y - z 被解析为x - (y - z) 还是(x - y) - z

巧合的是,我最近刚刚在学习这些东西,最后在我的博客上写了一篇关于运算符解析的类似方法的文章,你可以找到 here。在我的方法中,我处理中缀、前缀、后缀和混缀运算符(即? :);优先级和关联性都在表格中指定;我使用堆栈来跟踪尚未找到操作数的运算符。然后解析器构建一个解析树,其中每个节点都是一个子表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2019-10-06
    • 2020-07-28
    相关资源
    最近更新 更多