Glen Whitney
804a00902a
Some checks failed
continuous-integration/drone/push Build is failing
Caveat: type is still not being assigned for the Sequence() constructor. Also fixes the parsing of literal strings (whitespace just after the opening quote was being ignored, and was ambiguous just before the opening quote).
42 lines
1.3 KiB
Plaintext
42 lines
1.3 KiB
Plaintext
module javascript
|
|
imports libstrategolib signatures/- util
|
|
|
|
rules
|
|
js: TopLevel(x) -> $[const Stdio = {
|
|
gets: v => { process.stdout.write(String(v)); return Stdio; },
|
|
}
|
|
function to(data, strm) {
|
|
strm.gets(data);
|
|
return data;
|
|
}
|
|
[x]]
|
|
|
|
js: Stream() -> $[Stdio]
|
|
js: Int(x) -> x
|
|
js: LitString(x) -> <javaLitString>x
|
|
js: Sum(x,y) -> $[[x] + [y]]
|
|
js: Gets(x, y) -> $[[x].gets([y])]
|
|
js: To(x, y) -> $[to([x],[y])]
|
|
js: Terminate(x) -> x
|
|
js: Sequence(l) -> <join(|";\n")>l
|
|
|
|
/* Characters we need to escape in Javascript string constants */
|
|
Jscape: ['\t' | cs ] -> ['\', 't' | cs ]
|
|
/* I think I can just use ASCII constants for characters... */
|
|
Jscape: [ 0 | cs ] -> ['\', '0' | cs ]
|
|
Jscape: [ 8 | cs ] -> ['\', 'b' | cs ] // Backspace
|
|
Jscape: [ 11 | cs ] -> ['\', 'v' | cs ] // Vertical tab
|
|
Jscape: [ 12 | cs ] -> ['\', 'f' | cs ] // Form feed
|
|
|
|
strategies
|
|
javaLitString = un-single-quote
|
|
; string-as-chars(escape-chars(Escape <+ Jscape))
|
|
; single-quote
|
|
|
|
javascript = bottomup(try(js))
|
|
|
|
// Interface javascript code generation with editor services and file system
|
|
to-javascript: (selected, _, _, path, project-path) -> (filename, result)
|
|
with filename := <guarantee-extension(|"js")> path
|
|
; result := <javascript> selected
|