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 に答える