commit ac98ac5

shrub  ·  2026-10-14 21:23:36 +0000 UTC
parent d33c27b
parse variables
3 files changed,  +28, -15
+1, -1
1@@ -12,7 +12,7 @@ let
2         cur  = $IO.fgetc0(manifest),
3         line = 1,
4         col  = 1 }
5-    val result = parse(s, nil_vt(), nil_vt())
6+    val result = parse(s, nil_vt(), nil_vt(), nil_vt())
7 in
8     printrule(result.rules);
9     manifest_free(result);
+23, -11
 1@@ -54,10 +54,11 @@ end
 2 
 3 implement manifest_free(m) =
 4 let
 5-    val @{rules = r, edges = e} = m
 6+    val @{rules = r, edges = e, variables = v} = m
 7 in
 8     rule_free(r);
 9     edge_free(e);
10+    bindings_free(v)
11 end
12 
13 fun binding_val(s: &scanner): Strptr1 = 
14@@ -89,6 +90,13 @@ fun rulebinding(s: &scanner,
15         end
16     else(list_vt_reverse(b))
17    
18+fun variable(s: &scanner, name: Strptr1): binding = 
19+let
20+    val value = binding_val(s)
21+in 
22+    @{key = name, value = value}
23+end
24+
25 
26 (* does a list of bindings contain a "command" binding *)
27 fun hascommand(bindings: !List0_vt(binding)): bool =
28@@ -228,7 +236,7 @@ implement printrule(rules) =
29      printrule(rest);
30      fold@(rules) )
31 
32-implement parse(s, rules, edges) (*manifest*) = 
33+implement parse(s, rules, edges, variables) (*manifest*) = 
34 let
35     val tok = scankeyword(s)
36 in
37@@ -237,34 +245,38 @@ in
38                                         val r    = rule(s);
39                                         val more = cons_vt(r, rules)
40                                     in
41-                                        parse(s, more, edges)
42+                                        parse(s, more, edges, variables)
43                                     end)
44     | ~TOKbuild(line,col)       => (println!("build at: ", line,":", col);
45                                     (let 
46                                         val b = build(s)
47                                     in
48-                                        if hasrule(rules, b.rule) then 
49+                                        if hasrule(rules, b.rule) then (
50                                             let 
51                                                 val more = cons_vt(b, edges)
52                                             in
53-                                                parse(s, rules, more)
54+                                                parse(s, rules, more, variables)
55                                             end
56-                                        else (
57+                                        ) else (
58                                             prerrln!("unknown rule ", b.rule, " at ", line,":",col);
59                                             edge_free(cons_vt(b, nil_vt()));
60+                                            bindings_free(variables);
61                                             rule_free(rules);
62                                             edge_free(edges);
63                                             $raise ParseErr)
64                                     end))
65     | ~TOKvar  (text, line,col) => (println!("var ", text, " at ", line,":", col);
66-                                    rule_free(rules);
67-                                    edge_free(edges);
68-                                    strptr_free(text);
69-                                    $raise ParseErr)
70+                                    let 
71+                                        val entry = variable(s, text);
72+                                        val more  = cons_vt(entry, variables)
73+                                    in
74+                                        parse(s, rules, edges, more)
75+                                    end)
76     | ~TOKeof(line,col)         => (println!("eof at: ", line,":", col);
77                                    @{
78                                        rules = list_vt_reverse(rules),
79-                                       edges = list_vt_reverse(edges)
80+                                       edges = list_vt_reverse(edges),
81+                                       variables = list_vt_reverse(variables)
82                                    }))
83 end
84 
+4, -3
 1@@ -17,11 +17,12 @@ vtypedef edge = @{
 2 }
 3 
 4 vtypedef manifest = @{
 5-    rules = List0_vt(rule),
 6-    edges = List0_vt(edge)
 7+    rules     = List0_vt(rule),
 8+    edges     = List0_vt(edge),
 9+    variables = List0_vt(binding)
10 }
11 
12 fun manifest_free(m: manifest): void 
13 fun printrule(rules: !List0_vt(rule)): void
14-fun parse(s: &scanner, rules: List0_vt(rule), edges: List0_vt(edge)): manifest
15+fun parse(s: &scanner, rules: List0_vt(rule), edges: List0_vt(edge), variables: List0_vt(binding)): manifest
16