浏览代码

ft: 代码调整

master
SisMaker 4 年前
父节点
当前提交
3a6a68d652
共有 2 个文件被更改,包括 55 次插入52 次删除
  1. +2
    -2
      src/eAcs.erl
  2. +53
    -50
      src/genAcs.erl

+ 2
- 2
src/eAcs.erl 查看文件

@ -110,8 +110,8 @@ getOutput(0) ->
false;
getOutput(State) ->
{FailState, Pattern} = acsTrees:failOut(State),
case Pattern of
undefined ->
case Pattern == undefined orelse FailState == 0 of
true ->
false;
_ ->
getOutput(FailState)

+ 53
- 50
src/genAcs.erl 查看文件

@ -10,8 +10,8 @@ main(Args) ->
case file:open(SWFile, [read, raw, binary, {read_ahead, 65536}, {encoding, utf8}]) of
{ok, IoDevice} ->
{Goto, Output} = dealEveryLine(IoDevice, _Goto = #{0 => #{}}, _Output = #{}, _State = 0),
Failure = genFailure(Goto),
genErl(WriteDir, Goto, Failure, Output);
Fail = genFail(Goto),
genErl(WriteDir, Goto, Fail, Output);
_Err ->
io:format("genAcs open the file:~p error ~p~n", [SWFile, _Err])
end.
@ -22,7 +22,7 @@ dealEveryLine(IoDevice, Goto, Output, MaxState) ->
BinStr = binary:part(DataStr, 0, byte_size(DataStr) - 1),
case BinStr =/= <<>> of
true ->
{NewGoto, NewState, NewMaxState} = addPattern(BinStr, Goto, 0, MaxState),
{NewGoto, NewState, NewMaxState} = addGoto(BinStr, Goto, 0, MaxState),
NewOutput = Output#{NewState => BinStr},
dealEveryLine(IoDevice, NewGoto, NewOutput, NewMaxState);
_ ->
@ -34,18 +34,19 @@ dealEveryLine(IoDevice, Goto, Output, MaxState) ->
io:format("genAcs read the file error ~p~n", [_Err])
end.
%% ac搜索树
%% ac搜索树
genTree(BinStrList) ->
%% goto and output table
{Goto, Output} = genGotoOutput(BinStrList, _Goto = #{0 => #{}}, _Output = #{}, _State = 0),
%% failure table
Failure = genFailure(Goto),
{Goto, Failure, Output}.
%% fail table
Fail = genFail(Goto),
{Goto, Fail, Output}.
%% goto and output table
genGotoOutput([BinStr | Tail], Goto, Output, MaxState) ->
case BinStr =/= <<>> of
true ->
{NewGoto, NewState, NewMaxState} = addPattern(BinStr, Goto, 0, MaxState),
{NewGoto, NewState, NewMaxState} = addGoto(BinStr, Goto, 0, MaxState),
NewOutput = Output#{NewState => BinStr},
genGotoOutput(Tail, NewGoto, NewOutput, NewMaxState);
_ ->
@ -54,65 +55,67 @@ genGotoOutput([BinStr | Tail], Goto, Output, MaxState) ->
genGotoOutput([], Goto, Output, _MaxState) ->
{Goto, Output}.
addPattern(<<Word/utf8, Tail/binary>>, Goto, State, MaxState) ->
%% Goto
addGoto(<<Word/utf8, Tail/binary>>, Goto, State, MaxState) ->
#{State := Node} = Goto,
case Node of
#{Word := NextState} ->
addPattern(Tail, Goto, NextState, MaxState);
addGoto(Tail, Goto, NextState, MaxState);
_ ->
NewMaxState = MaxState + 1,
NewNode = Node#{Word => NewMaxState},
addPattern(Tail, Goto#{NewMaxState => #{}, State => NewNode}, NewMaxState, NewMaxState)
addGoto(Tail, Goto#{NewMaxState => #{}, State => NewNode}, NewMaxState, NewMaxState)
end;
addPattern(<<>>, Goto, State, MaxState) ->
addGoto(<<>>, Goto, State, MaxState) ->
{Goto, State, MaxState}.
genFailure(#{0 := Node} = Goto) ->
States = maps:values(Node),
genFailure(States, Goto, _Failure = #{}).
%% Fail状态转移项
genFail(#{0 := Node} = Goto) ->
genFail(maps:values(Node), Goto, _Fail = #{}).
%% failure with bfs搜索
genFailure([State | Tail], Goto, Failure) ->
%% bfs搜索构造 Fail
genFail([State | Tail], Goto, Fail) ->
#{State := Node} = Goto,
%% find the starting point: the parent's failure node
FailState = maps:get(State, Failure, 0),
%% children
%%
FailState = maps:get(State, Fail, 0),
%%
Kvs = maps:to_list(Node),
%% find failure node for all children
NewFailure = genFailureInner(Kvs, FailState, Goto, Failure),
%%
NewFail = addFail(Kvs, FailState, Goto, Fail),
%% add children states to the queue
%%
NewQueue = Tail ++ maps:values(Node),
genFailure(NewQueue, Goto, NewFailure);
genFailure([], _Goto, Failure) ->
Failure.
genFail(NewQueue, Goto, NewFail);
genFail([], _Goto, Fail) ->
Fail.
%%
%% @param FailState
genFailureInner([], _FailState, _Goto, Failure) ->
Failure;
genFailureInner([{Word, State} | Tail], FailState, Goto, Failure) -pan>>;
NewFailure = findFailureNode(Word, State, FailState, Goto, Failure),
genFailureInner(Tail, FailState, Goto, NewFailure).
addFail([{Word, State} | Tail], FailState, Goto, Fail) ->
NewFail = findFailNode(Word, State, FailState, Goto, Fail),
addFail(Tail, FailState, Goto, NewFail);
addFail([], _FailState, _Goto, Fail) ->
Fail.
%%
findFailureNode(Word, State, FailState, Goto, Failure) ->
findFailNode(Word, State, FailState, Goto, Fail) ->
#{FailState := Node} = Goto,
case Node of
#{Word := TheFailState} ->
%%
Failure#{State => TheFailState};
Fail#{State => TheFailState};
_ ->
case FailState =:= 0 of
true -> %%
Failure;
_ -> %%
NewFailState = maps:get(FailState, Failure, 0),
findFailureNode(Word, State, NewFailState, Goto, Failure)
true ->
%%
Fail;
_ ->
%%
NewFailState = maps:get(FailState, Fail, 0),
findFailNode(Word, State, NewFailState, Goto, Fail)
end
end.
@ -142,10 +145,10 @@ doGenGoto([{K, V} | SortKvs], StrAcc) ->
doGenGoto(SortKvs, StrAcc)
end.
genFailOut([], _Failure, _Output, StrAcc) ->
genFailOut([], _Fail, _Output, StrAcc) ->
<<StrAcc/binary, "\nfailOut(_) -> {0, undefined}.\n\n">>;
genFailOut([State], Failure, Output, StrAcc) ->
FailState = maps:get(State, Failure, 0),
genFailOut([State], Fail, Output, StrAcc) ->
FailState = maps:get(State, Fail, 0),
Pattern = maps:get(State, Output, undefined),
case FailState /= 0 orelse Pattern /= undefined of
true ->
@ -153,20 +156,20 @@ genFailOut([State], Failure, Output, StrAcc) ->
_ ->
<<StrAcc/binary, ";\nfailOut(_) -> {0, undefined}.\n\n">>
end;
genFailOut([State | SortStates], Failure, Output, StrAcc) ->
FailState = maps:get(State, Failure, 0),
genFailOut([State | SortStates], Fail, Output, StrAcc) ->
FailState = maps:get(State, Fail, 0),
Pattern = maps:get(State, Output, undefined),
case FailState /= 0 orelse Pattern /= undefined of
true ->
NewStrAcc = <<StrAcc/binary, "failOut(", (integer_to_binary(State))/binary, ") -> ", (iolist_to_binary(io_lib:format(<<"~w">>, [{FailState, Pattern}])))/binary, ";\n">>,
genFailOut(SortStates, Failure, Output, NewStrAcc);
genFailOut(SortStates, Fail, Output, NewStrAcc);
_ ->
genFailOut(SortStates, Failure, Output, StrAcc)
genFailOut(SortStates, Fail, Output, StrAcc)
end.
genErl(WriteDir, Goto, Failure, Output) ->
genErl(WriteDir, Goto, Fail, Output) ->
HeadStr = genHead(),
GotoStr = genGoto(Goto, HeadStr),
FailureStr = genFailOut(lists:sort(maps:keys(Goto)), Failure, Output, GotoStr),
FailStr = genFailOut(lists:sort(maps:keys(Goto)), Fail, Output, GotoStr),
FileName = filename:join([WriteDir, "acsTrees.erl"]),
file:write_file(FileName, FailureStr).
file:write_file(FileName, FailStr).

正在加载...
取消
保存