From 129d33939653fc709164ba26018b6fcc5ad750fb Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Sun, 22 Dec 2013 16:41:10 -0500 Subject: [PATCH] more error stuff --- errors.js | 15 +++++++++++++-- parse.js | 14 +++++++------- tokenize.js | 6 +++--- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/errors.js b/errors.js index 1a9b08c..e02eef9 100644 --- a/errors.js +++ b/errors.js @@ -19,17 +19,28 @@ var JLException = { } } -function SyntaxError(linenum, charnum, message) { +function JSyntaxError(linenum, charnum, message) { this.linenum = linenum; this.charnum = charnum; this.errormessage = message; + this.stxerror = function() { + console.log("Syntax Error\n", + "Line #", this.linenum,"\n", + "Character #", this.charnum, "\n", + this.errormessage); + }; return this; } -function TypeError(linenum, charnum, token, message) { +function JTypeError(linenum, charnum, token, message) { this.linenum = linenum; this.charnum = charnum; this.errormessage = message; this.token = token; return this; } +TypeError.prototype = JLException; + +module.exports = + {JSyntaxError : JSyntaxError, + JTypeError : JTypeError}; diff --git a/parse.js b/parse.js index 6b10954..7b2f1b1 100755 --- a/parse.js +++ b/parse.js @@ -6,6 +6,7 @@ var tool = require("./tools.js"); var tokenizer = require("./tokenize.js"); var desugarer = require("./desugar.js"); var pprint = require("./pprint.js"); +var error = require("./errors.js"); var print = console.log; @@ -45,7 +46,7 @@ function parseMany(exprType, valid, tokens) { parsed = parse(tokens); } else { - throw "Error: unexpected token "+fst(tokens)[0]+" in parseMany"; + throw error.JSyntaxError(fst(tokens)[2], fst(tokens)[3], "Error: unexpected token "+fst(tokens)[0]+" in parseMany"); } results.push(parsed); @@ -105,7 +106,7 @@ function parseList(tokens) { var xs = parseBetween(function (x) { return true; }, "comma", tokens); } if (fst(tokens)[0] !== "right_square") { - throw "Error, list must be terminated by ]"; + throw error.JSyntaxError(fst(tokens)[3], fst(tokens)[2], "Error, list must be terminated by ]"); } tokens.pop(); return new typ.ListT(xs); @@ -114,8 +115,8 @@ function parseList(tokens) { function parseDefFunction(tokens) { var fname = parse(tokens); - if (!fname.exprType === "identifier") { - throw "Error, expected an identifier in function definition"; + if (fname.exprType != "Name") { + throw error.JSyntaxError(fst(tokens)[3], fst(tokens)[2], "Error, expected an identifier in function definition"); } if (fst(tokens)[0] === "right_paren") { var parameters = []; @@ -319,9 +320,8 @@ function parseFull(tokenized) { } return ast; } catch (e) { - print("An exception occured, could not finish parsing"); - print(e); - process.exit(1); + e.stxerror(); + process.exit(1); } } console.log(parseFull(tokenizer.tokenize(istr)).map(pprint.pprint).join("\n")); diff --git a/tokenize.js b/tokenize.js index bc9e045..8c42e77 100755 --- a/tokenize.js +++ b/tokenize.js @@ -2,6 +2,7 @@ var rep = require("./representation.js"); var tools = require("./tools.js"); +var error = require("./errors.js"); var operators = Object.keys(rep.OPInfo); var matchop = tools.opMatch(operators); @@ -103,7 +104,7 @@ function tokenizeStr(tokstream, charnum, linenum) { n++; charnum++; if (tokstream.length < 1) { - throw "Error: missing quotation mark"; + throw error.JSyntaxError(linenum, charnum, "Error: missing quotation mark"); } } n++; @@ -316,8 +317,7 @@ function tokenizeFull(input) { return x[0] !== "whitespace"; }); } catch (e) { - console.log("An error occured during tokenization"); - console.log(e); + console.log(e.stxerror()); process.exit(1); } }