// This is just a little experiment inspired by Mike Samuel's quasiliterals // -- Alex Warth ometa Quasi <: Parser { number = , hole = "${" <(~"}" char)*>:ans "}" -> ans } ometa Math <: Quasi { expr = expr:x "+" mult:y -> (x + y) | expr:x "-" mult:y -> (x - y) | mult, mult = mult:x "*" prim:y -> (x * y) | mult:x "/" prim:y -> (x / y) | prim, prim = "(" expr:x ")" -> x | number:n -> parseInt(n) | hole:x -> (+x), main = expr } ometa QJSParser <: BSJSParser { special = ^special | '`' -> ['`', '`'], primExpr = primExpr:qp "`" <(~"`" char)*>:s "`" -> ["send", "matchAll", qp, ["string", s], ["string", "main"]] | ^primExpr } translateCode = function(s) { var tree = QJSParser.matchAll(s, "topLevel") var code = BSJSTranslator.match(tree, "trans") return code } // ---------------------------------- alert("the answer is " + Math`3 + ${4}`)