Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 51 additions & 8 deletions javascript/FormalityLang.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
Expand Down Expand Up @@ -1285,4 +1326,6 @@ module.exports = {
stringify_defs,
highlight_code,
stringify_err,
take_while,
str_char
};
9 changes: 6 additions & 3 deletions javascript/bin/lib.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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 {
Expand Down