aboutsummaryrefslogtreecommitdiffstats
path: root/system/doc/programming_examples/funparse.erl
diff options
context:
space:
mode:
Diffstat (limited to 'system/doc/programming_examples/funparse.erl')
-rw-r--r--system/doc/programming_examples/funparse.erl74
1 files changed, 74 insertions, 0 deletions
diff --git a/system/doc/programming_examples/funparse.erl b/system/doc/programming_examples/funparse.erl
new file mode 100644
index 0000000000..5e23c90df9
--- /dev/null
+++ b/system/doc/programming_examples/funparse.erl
@@ -0,0 +1,74 @@
+-module(funparse).
+-compile(export_all).
+-import(lists, [reverse/1]).
+
+%17
+%% > hof:parse([a,c]).
+%% {ok,{'and',{'or',1,{const,a}},{'or',1,{const,c}}}}
+%% > hof:parse([a,d]).
+%% {ok,{'and',{'or',1,{const,a}},{'or',2,{const,d}}}}
+%% > hof:parse([b,c]).
+%% {ok,{'and',{'or',2,{const,b}},{'or',1,{const,c}}}}
+%% > hof:parse([b,d]).
+%% {ok,{'and',{'or',2,{const,b}},{'or',2,{const,d}}}}
+%% > hof:parse([a,b]).
+%% fail
+%17
+
+%% Grammar = (a | b) & (c | d)
+
+%12
+parse(List) ->
+ (grammar())(List).
+%12
+
+%13
+grammar() ->
+ pand(
+ por(pconst(a), pconst(b)),
+ por(pconst(c), pconst(d))).
+%13
+
+%14
+pconst(X) ->
+ fun (T) ->
+ case T of
+ [X|T1] -> {ok, {const, X}, T1};
+ _ -> fail
+ end
+ end.
+%14
+
+%15
+por(P1, P2) ->
+ fun (T) ->
+ case P1(T) of
+ {ok, R, T1} ->
+ {ok, {'or',1,R}, T1};
+ fail ->
+ case P2(T) of
+ {ok, R1, T1} ->
+ {ok, {'or',2,R1}, T1};
+ fail ->
+ fail
+ end
+ end
+ end.
+%15
+
+%16
+pand(P1, P2) ->
+ fun (T) ->
+ case P1(T) of
+ {ok, R1, T1} ->
+ case P2(T1) of
+ {ok, R2, T2} ->
+ {ok, {'and', R1, R2}};
+ fail ->
+ fail
+ end;
+ fail ->
+ fail
+ end
+ end.
+%16