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)