-2

添付ファイルは、ネストされた if ステートメントとしてツリーを表す Java ソース コードに変換したいツリー構造を表します。

STOP_WORDS > 0
| NEXT_TYPE > 5: X
| NEXT_TYPE <= 5: Y
STOP_WORDS <= 0
…


If (STOP_WORDS > 0)
{
                If (NEXT_TYPE > 5)
                {
                                Return X
                }
                If ( NEXT_TYPE <= 5)
                {
                                Return Y
                }
}
If (STOP_WORDS <= 0)
{
….
}

ご覧のとおり、パイプ ( | ) 記号を使用したインデント レベルは親子関係を表します。 このプログラムは Java で記述できますが、必要に応じて他の適切な言語で記述することもできます。

以下は、If ステートメントに変換する必要があるテキスト ファイルです。

STOP_WORDS > 0
| NEXT_TYPE > 5: 5
| NEXT_TYPE <= 5: 1
STOP_WORDS <= 0
| STREET_TYE > 0
| | PREVIOUS_TYPE > 5: 2
| | PREVIOUS_TYPE <= 5
| | | NEXT_TYPE > 5: 2
| | | NEXT_TYPE <= 5: 5
| STREET_TYE <= 0
| | PERSON_TITLE > 0
| | | NEXT_TYPE <= 5: 4
| | | NEXT_TYPE > 5: 5
| | PERSON_TITLE <= 0
| | | SURNAME > 0
| | | | PREVIOUS_TYPE <= 4: 3
| | | | PREVIOUS_TYPE > 4: 5
| | | SURNAME <= 0
| | | | FIRST_NAME > 0
| | | | | NEXT_TYPE <= 5: 0
| | | | | NEXT_TYPE > 5: 5
| | | | FIRST_NAME <= 0
| | | | | TOKEN_LENGTH <= 1
| | | | | | NEXT_TYPE <= 4: 0
| | | | | | NEXT_TYPE > 4
| | | | | | | NEXT_TYPE <= 5: 1
| | | | | | | NEXT_TYPE > 5: 5
| | | | | TOKEN_LENGTH >1
| | | | | | NEXT_TYPE > 4: 5
| | | | | | NEXT_TYPE <= 4: 0
| | | | | | | PREVIOUS_TYPE <= 1: 4
| | | | | | | PREVIOUS_TYPE >1
| | | | | | | | PREVIOUS_TYPE >3: 4
| | | | | | | | PREVIOUS_TYPE <= 3: 5

私の問題は、以前の If ステートメントとそれらをいつ閉じるかを追跡するロジックが見つからないことです。ご覧のとおり、各行には多くのパイプ (|) があり、パイプが少ない場合と多い場合があります。私はそれの論理を見つけられません。

どんな助けでも大歓迎です。

4

2 に答える 2

0

パイソン

with open('input.txt') as f:
    indent = 8
    prev_depth = -1
    closes = []
    for line in f:
        line = line.strip()
        if not line: continue

        depth = line.count('|')
        while prev_depth >= depth:
            prev_depth -= 1
            print(closes.pop())
        pad = ' ' * (depth*indent)
        print(pad + 'If ({})'.format(line.lstrip('| ').split(':', 1)[0]))
        print(pad + '{')
        closes.append(pad + '}')
        if ':' in line:
            pad2 = ' ' * ((depth+1)*indent)
            print(pad2 + 'Return {}'.format(line[line.find(':')+1:].strip()))
        prev_depth = depth
    while closes:
        print(closes.pop())
于 2013-07-27T07:31:21.773 に答える
0

あなたの質問は非常に不明確ですが、ここから始めましょう

barometer = 0
with open('path/to/input') as infile:
    for line in infile:
        barometer += delta
        line = ''.join(itertools.dropwhile(lambda c: c in ' |', line))
        if ":" in line:
            cond, act = line.split(":",1)
            print "If (%s) { Return %s }" %(cond, act)
        else:
            delta = barometer - sum(1 for i in itertools.takewhile(lambda c: c in ' |', line))
            if delta < 0:
                print " {}"[delta/abs(delta)]*abs(delta)
            print "If (%s) {" %cond

私は今寝なければなりませんが、少なくともこれで始められるはずです。

于 2013-07-27T07:19:58.340 に答える