commit 1d15784
shrub
·
2026-10-16 14:39:08 +0000 UTC
parent f2a655e
parse build statement bindings
2 files changed,
+12,
-8
+10,
-7
1@@ -53,11 +53,12 @@ fun edge_free(e: List0_vt(edge)): void =
2 | ~nil_vt() => ()
3 | ~cons_vt(edge, rest) =>
4 let
5- val @{output = o, rule = r, input = i} = edge
6+ val @{output = o, rule = r, input = i, bindings = b} = edge
7 in
8 paths_free(o);
9 strptr_free(r);
10 paths_free(i);
11+ bindings_free(b);
12 edge_free(rest)
13 end
14
15@@ -85,9 +86,9 @@ in
16 $raise ParseErr )
17 end
18
19-fun rulebinding(s: &scanner,
20- b: List0_vt(binding)):
21- List0_vt(binding) =
22+(* creates records if it sees indentation and adds them to a list, if it stops
23+ * seeing indentation, return the list *)
24+fun parsebindings(s: &scanner, b: List0_vt(binding)): List0_vt(binding) =
25 if scanindent(s) then
26 let
27 val key = scanname(s)
28@@ -95,7 +96,7 @@ fun rulebinding(s: &scanner,
29 val entry: binding = @{key = key, value = value}
30 val more = cons_vt(entry, b)
31 in
32- rulebinding(s, more)
33+ parsebindings(s, more)
34 end
35 else(list_vt_reverse(b))
36
37@@ -129,7 +130,7 @@ in
38 if s.cur = char2int0('\n') then (
39 next(s);
40 let
41- val bindings = rulebinding(s, nil_vt())
42+ val bindings = parsebindings(s, nil_vt())
43 in
44 if hascommand(bindings) = true then
45 @{name = rulename, bindings = bindings}
46@@ -203,7 +204,9 @@ let
47 in
48 if (s.cur = char2int0('\n')) then (
49 next(s);
50- @{output = o, rule = r, input = i}
51+ let val b = parsebindings(s, nil_vt())
52+ in @{output = o, rule = r, input = i, bindings = b}
53+ end
54 ) else (
55 paths_free (o);
56 paths_free (i);
+2,
-1
1@@ -13,7 +13,8 @@ vtypedef rule = @{
2 vtypedef edge = @{
3 output = List1_vt(Strptr1),
4 rule = Strptr1,
5- input = List0_vt(Strptr1)
6+ input = List0_vt(Strptr1),
7+ bindings = List0_vt(binding)
8 }
9
10 vtypedef manifest = @{