我有一段文字如下
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)
)
此刻我正在逐行阅读。我知道我需要测量缩进并解析下一行的表达式,以便找出当前行所属的表达式,但是我也无法在不消耗下一行的情况下搞清楚如何做到这一点
这似乎是一种具有递归解决方案的问题,但它正在逃避我。
输入格式不是固定的,我只是希望能够将一个相对可读的表达式转换为布尔树,所以如果你能用更合适的格式回答仍然可读,请执行以下操作:)
答案 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
希望这有帮助!