将缩进列表解析为布尔树

时间:2013-01-12 03:06:13

标签: php parsing tree indentation

我有一段文字如下

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

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

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

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

1 个答案:

答案 0 :(得分: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

希望这有帮助!