diff options
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/lux/compiler/default/syntax.lux | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/stdlib/source/lux/compiler/default/syntax.lux b/stdlib/source/lux/compiler/default/syntax.lux index 1584321e5..d281cc168 100644 --- a/stdlib/source/lux/compiler/default/syntax.lux +++ b/stdlib/source/lux/compiler/default/syntax.lux @@ -237,17 +237,16 @@ g!_ body)) -(def: (read-text [where offset source-code]) - Parser +(template: (!read-text where offset source-code) (case ("lux text index" source-code (static ..text-delimiter) offset) - (#.Some end) - (let [content (!clip offset end source-code)] - (<| (!guarantee-no-new-lines content) - (#error.Success [[(update@ #.column (n/+ (!n/- offset end)) where) - (!inc end) + (#.Some g!end) + (let [g!content (!clip offset g!end source-code)] + (<| (!guarantee-no-new-lines g!content) + (#error.Success [[(update@ #.column (n/+ (!n/- offset g!end)) where) + (!inc g!end) source-code] [where - (#.Text content)]]))) + (#.Text g!content)]]))) _ (ex.throw unrecognized-input where))) @@ -289,11 +288,11 @@ (or (!strict-name-char? char) (!digit? char))) -(template: (!discrete-output <codec> <tag>) - (case (:: <codec> decode (!clip start end source-code)) +(template: (!discrete-output <start> <end> <codec> <tag>) + (case (:: <codec> decode (!clip <start> <end> source-code)) (#error.Success output) - (#error.Success [[(update@ #.column (n/+ (!n/- start end)) where) - end + (#error.Success [[(update@ #.column (n/+ (!n/- <start> <end>)) where) + <end> source-code] [where (<tag> output)]]) @@ -305,17 +304,27 @@ (-> Offset Parser) (let [source-code//size ("lux text size" source-code)] (loop [end offset] - (<| (!with-char+ source-code//size source-code end char (!discrete-output <codec> <tag>)) + (<| (!with-char+ source-code//size source-code end char (!discrete-output start end <codec> <tag>)) (if (!digit?+ char) (recur (!inc end)) - (!discrete-output <codec> <tag>))))))] + (!discrete-output start end <codec> <tag>))))))] - [parse-nat number.Codec<Text,Nat> #.Nat] [parse-int number.Codec<Text,Int> #.Int] - [parse-rev number.Codec<Text,Rev> #.Rev] ) -(template: (!parse-int source-code//size offset where source-code @end) +(do-template [<name> <codec> <tag>] + [(template: (<name> source-code//size start where offset source-code) + (loop [g!end offset] + (<| (!with-char+ source-code//size source-code g!end g!char (!discrete-output start g!end <codec> <tag>)) + (if (!digit?+ g!char) + (recur (!inc g!end)) + (!discrete-output start g!end <codec> <tag>)))))] + + [!parse-nat number.Codec<Text,Nat> #.Nat] + [!parse-rev number.Codec<Text,Rev> #.Rev] + ) + +(template: (!parse-signed source-code//size offset where source-code @end) (let [g!offset/1 (!inc offset)] (<| (!with-char+ source-code//size source-code g!offset/1 g!char/1 @end) (if (!digit? g!char/1) @@ -446,7 +455,8 @@ ## Text (~~ (static ..text-delimiter)) - (read-text <consume-1>) + (let [offset/1 (!inc offset/0)] + (!read-text where offset/1 source-code)) ## Special code (~~ (static ..sigil)) @@ -486,21 +496,23 @@ (let [offset/1 (!inc offset/0)] (<| (!with-char+ source-code//size source-code offset/1 char/1 <end>) (if (!digit? char/1) - (parse-rev offset/0 [where (!inc offset/1) source-code]) + (let [offset/2 (!inc offset/1)] + (!parse-rev source-code//size offset/0 where offset/2 source-code)) (!parse-short-name current-module <consume-1> where #.Identifier)))) (~~ (static ..positive-sign)) - (!parse-int source-code//size offset/0 where source-code <end>) + (!parse-signed source-code//size offset/0 where source-code <end>) (~~ (static ..negative-sign)) - (!parse-int source-code//size offset/0 where source-code <end>)] + (!parse-signed source-code//size offset/0 where source-code <end>)] ## else (cond (!digit? char/0) ## Natural number - (parse-nat offset/0 <consume-1>) + (let [offset/1 (!inc offset/0)] + (!parse-nat source-code//size offset/0 where offset/1 source-code)) ## Identifier - (!name-char?|head char/0) + (!strict-name-char? char/0) (!parse-full-name offset/0 <consume-1> where #.Identifier) ## else |