我如何解析这种类型的表达式?

时间:2013-07-29 18:42:51

标签: python parsing expression operator-precedence

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

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)))

我不确定是否应该采用基于堆栈的评估?我目前正在试用一个,如果能让它运行,我会发布一个有效的代码。

有关实现此目的的简单方法的任何建议吗?

1 个答案:

答案 0 :(得分:3)

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

一种有效的方法称为“自上而下的运算符优先级”,也可能是“运算符优先级”和“优先级爬升”解析。以下是一些很好的消息来源,详细解释了这种方法:

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

关键概念是:

  • 前缀vs中缀vs mixfix

  • 优先:3 + 4 * 5解析为(3 + 4) * 53 + (4 * 5)

  • 结社性:x - y - z被解析为x - (y - z)(x - y) - z

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