diff --git a/javascript/FormalityLang.js b/javascript/FormalityLang.js index 1d3c7f7..79282bb 100644 --- a/javascript/FormalityLang.js +++ b/javascript/FormalityLang.js @@ -539,20 +539,39 @@ function parse_chr(code, indx, err) { )))); }; +function take_while(cond, code, indx) { + var acc = [] + while (indx < code.length && cond(code[indx])) { + acc.push(code[indx]) + indx++; + }; + return [indx, acc]; +}; + +function str_char(chr) { + var val = chr.charCodeAt(0); + return (val != 34 && val >= 32 && val < 127 ) +}; + // Parses a string literal, "foo" + function parse_str(code, indx, err) { var from = next(code, indx); return ( chain(parse_txt(code, next(code, indx), "\""), (indx, skip) => - chain((function go(indx, slit) { + chain((function go(indx) { if (indx < code.length) { - if (code[indx] !== "\"") { - var chr = make_chr(code[indx]); - var [indx, slit] = go(indx + 1, slit); - return [indx, App(false, App(false, Ref("String.cons"), chr), slit)]; - } else { - return [indx+1, Ref("String.nil")]; - } + var acc = [] + while (code[indx] !== "\"") { + acc.push(code[indx]); + indx++; + }; + var slit = Ref("String.nil") + while (acc.length > 0) { + var chr = make_chr(acc.pop()); + slit = App(false, App(false, Ref("String.cons"), chr), slit); + }; + return [indx+1, slit]; } else if (err) { parse_error(code, indx, "string literal", true); } else { @@ -562,6 +581,28 @@ function parse_str(code, indx, err) { [indx, xs => Loc(from, indx, Ann(true, slit, Ref("String")))]))); }; +//function parse_str(code, indx, err) { +// var from = next(code, indx); +// return ( +// chain(parse_txt(code, next(code, indx), "\""), (indx, skip) => +// chain((function go(indx, slit) { +// if (indx < code.length) { +// if (code[indx] !== "\"") { +// var chr = make_chr(code[indx]); +// var [indx, slit] = go(indx + 1, slit); +// return [indx, App(false, App(false, Ref("String.cons"), chr), slit)]; +// } else { +// return [indx+1, Ref("String.nil")]; +// } +// } else if (err) { +// parse_error(code, indx, "string literal", true); +// } else { +// return null; +// } +// })(indx), (indx, slit) => +// [indx, xs => Loc(from, indx, Ann(true, slit, Ref("String")))]))); +//}; + // Parses a list literal, `[a, b, c]` function parse_lst(code, indx, err) { var from = next(code, indx); @@ -1285,4 +1326,6 @@ module.exports = { stringify_defs, highlight_code, stringify_err, + take_while, + str_char }; diff --git a/javascript/bin/lib.js b/javascript/bin/lib.js index acc24a8..ba3d7fa 100644 --- a/javascript/bin/lib.js +++ b/javascript/bin/lib.js @@ -6,13 +6,15 @@ function error(msg, exit_code) { }; function load(dir = ".", ext = ".fm", parse = fm.lang.parse, exit_code = 0) { + console.log("dir: " + dir) + console.log("ext: " + ext) var files = fs.readdirSync(dir).filter(file => file.slice(-ext.length) === ext); if (files.length === 0) { error("No local " + ext + " file found.", exit_code); } else { var result = {files: {}, defs: {}}; for (var file of files) { - var file_code = fs.readFileSync(file, "utf8"); + var file_code = fs.readFileSync(dir + "/" + file, "utf8"); try { var file_defs = parse(file_code, 0, file); } catch (err) { @@ -136,8 +138,9 @@ function _hs_(main = "main", dir, ext, parse) { //}; }; -function _io_(main = "main", dir, ext, parse) { - var {defs} = load(dir, ".fmc", fm.core.parse); +function _io_(main = "main", dir = ".fmc", parse) { + console.log(main) + var {defs} = load(".fmc", ".fmc", fm.core.parse); if (!defs[main]) { console.log("Term '" + main + "' not found."); } else {