Glen Whitney
f827c37baa
Some checks failed
continuous-integration/drone/push Build is failing
Also implements ++ string concatenation operator. Resolves #7, #18.
63 lines
1.9 KiB
Plaintext
63 lines
1.9 KiB
Plaintext
module javascript
|
|
imports libstrategolib signatures/- util
|
|
|
|
rules
|
|
js: TopLevel(x) -> $[// Fostr preamble
|
|
const _fostr_readline = require('readline');
|
|
const _fostr_events = require('events');
|
|
const _fostr_rl = _fostr_readline.createInterface({input: process.stdin});
|
|
const Stdio = {
|
|
gets: v => { process.stdout.write(String(v)); return Stdio; },
|
|
emit: async () => {
|
|
const [line] = await _fostr_events.once(_fostr_rl, 'line');
|
|
return line + "\n"; }
|
|
}
|
|
function to(data, strm) {
|
|
strm.gets(data);
|
|
return data;
|
|
}
|
|
|
|
const _fostr_body = async () => {
|
|
// End of preamble
|
|
|
|
[x]
|
|
|
|
// Fostr coda
|
|
_fostr_rl.close()
|
|
}
|
|
_fostr_body();
|
|
]
|
|
with line := "[line]"
|
|
|
|
js: Stream() -> $[Stdio]
|
|
js: Int(x) -> x
|
|
js: LitString(x) -> <javaLitString>x
|
|
js: EscString(x) -> x
|
|
js: Sum(x, y) -> $[[x] + [y]]
|
|
js: Concat(x, y) -> $[[x] + [y]]
|
|
js: Gets(x, y) -> $[[x].gets([y])]
|
|
js: To(x, y) -> $[to([x],[y])]
|
|
js: Emits(x) -> $[(await [x].emit())]
|
|
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
|