2016-04-09 6 views
1

パーズツリーを表示するだけです。私はすでに解析された文を持っているし、今は私が必要とするセクションProlog DCGパース表示

display_tree :- 
    sformat(A, 'Display tree ~w', vertical), 
    new(D, window(A)), 
    send(D, size, size(350,200)), 
    new(T, tree(text('Root'))), 
    send(T, neighbour_gap, 10), 
    new(S1, node(text('Child1'))), 
    new(S2, node(text('Child2'))), 
    send_list(T, son,[S1,S2]), 
    new(S11, node(text('Grandchild1'))), 
    new(S12, node(text('Grandchild2'))), 
    send_list(S1, son, [S11, S12]), 
    new(S21, node(text('Grandchild3'))), 
    new(S22, node(text('Grandchild4'))), 
    send_list(S2, son, [S21, S22]), 
    send(T, direction, vertical), 
    send(D, display, T), 
    send(D, open). 

に表示され、それをnode.hereによってルートが表示され、私はこの文

s(np(d(the),n(boy),rel(rpn(who),vp(iv(sits)))),vp(tv(reads),np(d(a),n(book)))) 

を表示したいと私の目標は

です
new(T,tree(text('s'))) 
new(S1, node(text('np'))), 
new(S2, node(text('vp'))), etc,. 

簡単な解決策はありますか?

答えて

1
show_parse_tree(S) :- 
    sformat(A, 'Display tree ~w', vertical), 
    new(D, window(A)), 
    send(D, size, size(800, 600)), 
    S =.. [F|Args], 
    new(T, tree(text(F))), 
    send(T, neighbour_gap, 10), 
    send(T, direction, vertical), 
    maplist(show_parse_tree, Args, Children), 
    send_list(T, son, Children), 
    send(D, display, T), 
    send(D, open). 

show_parse_tree(Arg, Child) :- 
    Arg =.. [F|Args], 
    new(Child, node(text(F))), 
    ( Args == [] 
    -> true 
    ; maplist(show_parse_tree, Args, Children), 
     send_list(Child, son, Children) 
    ). 

show_parse_tree :- 
    show_parse_tree(s(np(d(the),n(boy),rel(rpn(who),vp(iv(sits)))),vp(tv(reads),np(d(a),n(book))))). 

利回り

enter image description here

編集

コードを簡略化することができ、そして木の方向は、より良いパラメータとして渡されます。

show_parse_tree(Direction, SyntaxTree) :- 
    sformat(A, 'Display tree ~w', Direction), 
    new(D, window(A)), 
    send(D, size, size(800, 600)), 
    new(T, tree), 
    send(T, neighbour_gap, 10), 
    send(T, direction, Direction), 
    show_node(SyntaxTree, Root), 
    send(T, root, Root), 
    send(D, display, T), 
    send(D, open). 

show_node(Node, Child) :- 
    Node =.. [F|Args], 
    new(Child, node(text(F))), 
    maplist(show_node, Args, Children), 
    send_list(Child, son, Children). 

show_parse_tree :- 
    show_parse_tree(vertical, ...). 
+0

はそんなに –

+0

をありがとう@CapelliCのやり方私はsisctusでそれをすることができますか?もしそうでなければ、TclTkでどうやってやったのですか? –

+0

@AnsPiter:申し訳ありませんが、分かりません... – CapelliC