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 = @{