@@ -1,6 +1,7 @@
11/- *lua
22/+ st
3−/+ *interlist
3+/+ interlist
4+/+ *bintree
45=<
56apex
67|%
@@ -75,17 +76,64 @@ apex
7576:: Parse expressions separated by binary operators
7677::
7778++ parse-expr-list
78− %^ tnee %parse-expr-list (interlist binop expr)
79− %+ parse-interlist (ifix [ws ws] parse-binop) parse-atomic-expr
79+ %^ tnee %parse-expr-list (interlist:interlist binop expr)
80+ %+ parse:interlist (ifix [ws ws] parse-binop) parse-atomic-expr
8081:: TODO: This is mock and should take operator priority into account.
8182::
8283++ process-expr-list
83− |= l=(interlist binop expr)
84+ =<
85+ |= l=(interlist:interlist binop expr)
8486 ^- expr
85− ?- -.l
86− %single val.l
87− %double [%binop val.l sep.l (process-expr-list tail.l)]
88− ==
87+ %- strip-tree
88+ %- (process-left-assoc ~[%or])
89+ %- (process-left-assoc ~[%and])
90+ %- (process-left-assoc ~[%lt %gt %lteq %gteq %neq %eq])
91+ %- (process-left-assoc ~[%bor])
92+ %- (process-left-assoc ~[%bxor])
93+ %- (process-left-assoc ~[%band])
94+ %- (process-left-assoc ~[%rshft %lshft])
95+ %- (process-right-assoc ~[%concat])
96+ %- (process-left-assoc ~[%add %sub])
97+ %- (process-left-assoc ~[%mul %div %int-div %mod])
98+ %- (process-left-assoc ~[%pow])
99+ [%leaf l]
100+ |%
101+ ++ strip-tree
102+ |= tree=(bintree binop (interlist:interlist binop expr))
103+ ^- expr
104+ ?- -.tree
105+ %leaf ?> ?=(%single +<.tree) +>.tree
106+ %node [%binop $(tree l.tree) n.tree $(tree r.tree)]
107+ ==
108+ ++ process-right-assoc
109+ |= ops=(lest binop)
110+ |= tree=(bintree binop (interlist:interlist binop expr))
111+ ^+ tree
112+ ?- -.tree
113+ %leaf
114+ =/ l +.tree
115+ |-
116+ =/ splitted (split-left-on:interlist |=(op=binop (elem op ops)) l)
117+ ?~ splitted [%leaf l]
118+ [%node $(l lhs.u.splitted) pivot.u.splitted $(l rhs.u.splitted)]
119+ %node
120+ [%node $(tree l.tree) n.tree $(tree r.tree)]
121+ ==
122+ ++ process-left-assoc
123+ |= ops=(lest binop)
124+ |= tree=(bintree binop (interlist:interlist binop expr))
125+ ^+ tree
126+ ?- -.tree
127+ %leaf
128+ =/ l +.tree
129+ |-
130+ =/ splitted (split-right-on:interlist |=(op=binop (elem op ops)) l)
131+ ?~ splitted [%leaf l]
132+ [%node $(l lhs.u.splitted) pivot.u.splitted $(l rhs.u.splitted)]
133+ %node
134+ [%node $(tree l.tree) n.tree $(tree r.tree)]
135+ ==
136+ --
89137++ parse-expr
90138 %^ tnee %parse-expr expr
91139 %+ cook process-expr-list parse-expr-list
@@ -893,4 +941,8 @@ apex
893941 ^- ?
894942 &(?=(~ body.blok) ?=(~ ret.blok))
895943++ max-int 9.223.372.036.854.775.807
944+++ elem
945+ |= [nedl=* stak=(list *)]
946+ ^- ?
947+ ?=(^ (find ~[nedl] stak))
896948--