2

我有一段文字如下

foo
and foo2
and bar
    or something
    and somethingElse
        or somethingElse2
        or somethingElse3
and baz
    or godknows
    or godknows2

这应该解释为:

(
            foo
            && foo2
    && (bar || (something && (somethingElse || somethingElse2 || somethingElse 3)))
    && (baz || godknows || godknows2)
)

目前我正在逐行阅读。我知道我需要测量缩进并解析下一行的表达式,以便找出当前行也属于的表达式,但是我无法弄清楚如何在不消耗下一行的情况下有效地做到这一点.

这似乎是一种具有递归解决方案的问题,但它正在逃避我。

输入格式不固定,我只是希望能够将一个相对可读的表达式变成一个布尔树,所以如果你能用更合适的格式回答,仍然可读,请做:)

4

1 回答 1

2

使用这种缩进风格的 Python 通过维护一堆缩进级别来进行解析。在看到新行时,它通过查看当前深度是否增加来确定它是否已从前一行缩进。如果是这样,Python 会假装在输入流中插入了一个名为“INDENT”的不可见符号。然后它将新的深度压入堆栈。

如果缩进减少,Python 会反复弹出堆栈并假装一个名为“DEDENT”的不可见符号被插入到输入流中,直到缩进级别与堆栈上的值匹配。

您可以通过将“INDENT”和“DEDENT”替换为 ( 和 ) 来非常轻松地适应这种方法。之后您需要通过确保 ( 标记插入前一个变量之前进行小的转换,但我希望这不会太难。

通过这种更改,您应该能够非常轻松地解析它。例如,脚本

A
and B
    or C
       and D
or E

会变成

A and (B or (C and D))) or E

希望这可以帮助!

于 2013-01-12T03:26:42.037 回答