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