68 lines
1.8 KiB
Erlang
68 lines
1.8 KiB
Erlang
-spec mktree(Signal) -> Tree when
|
|
Signal :: gsc:signal(),
|
|
Tree :: gsc_ntree:ntree().
|
|
|
|
% @doc make into a tree
|
|
mktree(Sig) ->
|
|
Tree0 = gsc_ntree:nstem(vtokens, Sig),
|
|
Tree1 = rerootl_tkstr("=>", Tree0),
|
|
Tree2 = rerootl_tkstr("*", Tree1),
|
|
Tree2.
|
|
|
|
|
|
rerootl_tkstr(S, Tree0 = #ns{val = Root0}) ->
|
|
Kids0 = gsc_ntree:deleaf0(Tree0),
|
|
IsntS = fun(Tk) -> isnt_str(S, Tk) end,
|
|
case lists:splitwith(IsntS, Kids0) of
|
|
% found
|
|
% input:
|
|
% *s Root0
|
|
% |
|
|
% +-- .l Foo
|
|
% +-- .l "=>"
|
|
% +-- .l Bar
|
|
% output:
|
|
% *s "=>"
|
|
% |
|
|
% +-- *s Root0 -- .l Foo
|
|
% +-- *s Root0 -- .l Bar
|
|
{LHS1, [Tk0 | RHS1]} ->
|
|
Root1 = Root0,
|
|
LTree1 = gsc_ntree:releaf0(Root1, LHS1),
|
|
RTree1 = rerootl_tkstr(S, gsc_ntree:releaf0(Root1, RHS1)),
|
|
NewRoot0 = {op, Tk0},
|
|
NewKids0 = [LTree1, RTree1],
|
|
NewTree = gsc_ntree:releaf0(NewRoot0, NewKids0),
|
|
NewTree;
|
|
% not found, nothing to do
|
|
{Kids0, []} ->
|
|
Tree0
|
|
end.
|
|
|
|
|
|
%reroot_mapsto(Tree0 = #ns{val = Root0}) ->
|
|
% Kids0 = gsc_ntree:deleaf0(Tree0),
|
|
% IsntMapsto = fun(DL) -> isnt_str("=>", Tk) end,
|
|
% case lists:splitwith(IsntMapsto, Kids0) of
|
|
% % found
|
|
% {LHS1, [Tk0 | RHS1]} ->
|
|
% Root1 = Root0,
|
|
% LTree1 = gsc_ntree:releaf0(Root1, LHS1),
|
|
% RTree1 = reroot_mapsto(gsc_ntree:releaf0(Root1, RHS1)),
|
|
% NewRoot0 = {op, Tk0},
|
|
% NewKids0 = [LTree1, RTree1],
|
|
% NewTree = gsc_ntree:releaf0(NewRoot0, NewKids0),
|
|
% NewTree;
|
|
% % nothing to do
|
|
% {Kids0, []} ->
|
|
% Tree0
|
|
% end.
|
|
|
|
|
|
|
|
isnt_str(X, Y) ->
|
|
not is_str(X, Y).
|
|
|
|
is_str(S, #tk{str = S}) -> true;
|
|
is_str(_, _) -> false.
|