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) -> 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) -> 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 := path ; result := selected