commit f2a655e
shrub
·
2026-10-16 14:23:24 +0000 UTC
parent 17bd9dd
handle $ line continuation
2 files changed,
+26,
-17
+2,
-1
1@@ -1,7 +1,8 @@
2 # this is for testing!
3 #comment
4 rule cc
5- command = cc $in -o $out
6+ command = cc $
7+ $in -o $out
8 deps = gcc
9
10 rule shit
+24,
-16
1@@ -67,7 +67,8 @@ fun isvarc(c: int): bool =
2 isnamec(c) &&
3 c != char2int0('.')
4
5-fun dollar(s: &scanner): stringpart =
6+(*we may or may not return a stringpart, its like haskell "maybe"*)
7+fun dollar(s: &scanner): Option_vt(stringpart) =
8 let
9 (* assume the scanner is sitting on $ *)
10 val () = next(s)
11@@ -77,14 +78,24 @@ in
12 $raise ScanErr()
13 ) else
14 case+ int2char0(s.cur) of
15- | '$' => (
16+ | '$' => (
17 let val inserted = stringbuf_insert_char(s.buf, '$')
18- in if inserted = 1 then (next(s); Literal(stringbuf_takeout_all(s.buf)) ) else $raise ScanErr
19+ in if inserted = 1 then (next(s); Some_vt(Literal(stringbuf_takeout_all(s.buf))) ) else $raise ScanErr
20 end )
21- | ':' => (
22+ | ':' => (
23 let val inserted = stringbuf_insert_char(s.buf, ':')
24- in if inserted = 1 then (next(s); Literal(stringbuf_takeout_all(s.buf)) ) else $raise ScanErr
25+ in if inserted = 1 then (next(s); Some_vt(Literal(stringbuf_takeout_all(s.buf))) ) else $raise ScanErr
26 end )
27+ | ' ' => (
28+ let val inserted = stringbuf_insert_char(s.buf, ' ')
29+ in if inserted = 1 then (next(s); Some_vt(Literal(stringbuf_takeout_all(s.buf))) ) else $raise ScanErr
30+ end )
31+ | '\n' =>
32+ let
33+ val () = next(s)
34+ val () = skipspace(s)
35+ in None_vt()
36+ end
37 | '\{' =>
38 let
39 val () = next(s)
40@@ -96,13 +107,13 @@ in
41 ) else (
42 if s.cur = char2int0('}') then (
43 next(s);
44- Variable(stringbuf_takeout_all(s.buf))
45+ Some_vt(Variable(stringbuf_takeout_all(s.buf)))
46 ) else (
47 prerrln!("unclosed variable brace");
48 $raise ScanErr() )
49 )
50- end
51- | _ =>
52+ end
53+ | _ =>
54 let
55 val () = read(s, isvarc)
56 in
57@@ -110,7 +121,7 @@ in
58 prerrln!("expected variable name");
59 $raise ScanErr
60 ) else
61- Variable(stringbuf_takeout_all(s.buf))
62+ Some_vt(Variable(stringbuf_takeout_all(s.buf)))
63 end
64
65 end
66@@ -121,13 +132,10 @@ fun parts (s: &scanner, collected: List0_vt(stringpart)): List0_vt(stringpart) =
67 else
68 case+ int2char0(s.cur) of
69 | '\n' => list_vt_reverse(collected)
70- | '$' =>
71- let
72- val newpart = dollar(s);
73- val more = cons_vt(newpart, collected)
74- in
75- parts(s, more)
76- end
77+ | '$' => (
78+ case+ dollar(s) of
79+ | ~Some_vt(part) => parts(s, cons_vt(part, collected))
80+ | ~None_vt() => parts(s, collected) )
81 | _ =>
82 let
83 val newpart = readliteral(s)