diff --git a/parse.js b/parse.js index 301515c..795ec7b 100755 --- a/parse.js +++ b/parse.js @@ -1,5 +1,4 @@ #! /usr/bin/node - var fs = require("fs"); var typ = require("./representation.js"); var $ = require("./tools.js"); @@ -401,25 +400,34 @@ function parseIf(tokens) { } else { var ifC = parse(tokens); - if (!fst(tokens) || fst(tokens)[0] !== "thenexp") + if (!fst(tokens) || fst(tokens)[0] !== "thenexp") { throw error.JSyntaxError(fst(tokens)[3], fst(tokens)[2], "if ``exp'' must be folowed by ``then'' exp, not "+snd(tokens)[0]); + } else { tokens.pop(); var thenC = parse(tokens); if (fst(tokens) && fst(tokens)[0] === "elsexp") { tokens.pop(); + if (_.size(tokens) < 1) { + throw error.JSyntaxError(linenum, + charnum, + "Unexpected end of source"); + } + else { var elseC = parse(tokens); return new typ.If(ifC, thenC, elseC); - - } - else { - return new typ.If(ifC, thenC); - } - } - } + } + } + else { + throw error.JSyntaxError(linenum, + charnum, + "If expression must include an else variant"); + } + } + } } diff --git a/representation.js b/representation.js index ea4ba57..646429b 100644 --- a/representation.js +++ b/representation.js @@ -157,8 +157,7 @@ function DefFunc(ident, params, body) { function If(condition, thenexp, elseexp) { this.condition = condition; this.thenexp = thenexp; - if (elseexp) - this.elseexp = elseexp; + this.elseexp = elseexp; this.exprType = "If"; return this; } diff --git a/tokenize.js b/tokenize.js index 47ffcc4..99b2be3 100755 --- a/tokenize.js +++ b/tokenize.js @@ -215,7 +215,7 @@ function tokenize(tokstream, matchop) { case 45: // '-' lambda = peek(tokstream, "arrow", "->"); if (lambda) { - tokens.push(lambda); + tokens.push($.extend(lambda, [charnum, linenum])); tokstream = tokstream.substr(2); break; } @@ -242,7 +242,7 @@ function tokenize(tokstream, matchop) { case 116: // 't' result = tokenizeT(tokstream); if (result) { - tokens.push(result); + tokens.push($.extend(result, [charnum, linenum])); tokstream = tokstream.substr(4); // 4 = length of either token break; } @@ -250,13 +250,13 @@ function tokenize(tokstream, matchop) { case 105: // 'i' var ifexp = peek(tokstream, "ifexp", "if"); if (ifexp) { - tokens.push(ifexp); + tokens.push($.extend(ifexp, [linenum, charnum])); tokstream = tokstream.substr(2); break; } var inkeyword = peek(tokstream, "in", "in "); if (inkeyword) { - tokens.push(inkeyword); + tokens.push($.extend(inkeyword, [charnum, linenum])); tokstream = tokstream.substr(3); break; } @@ -279,7 +279,7 @@ function tokenize(tokstream, matchop) { case 101: // e result = peek(tokstream, "elsexp", "else"); if (result) { - tokens.push(result); + tokens.push($.extend(result, [charnum, linenum])); tokstream = tokstream.substr(4); break; } @@ -287,7 +287,7 @@ function tokenize(tokstream, matchop) { case 102: // f result = peek(tokstream, "falselit", "false"); if (result) { - tokens.push(result); + tokens.push($.extend(result, [charnum, linenum])); tokstream = tokstream.substr(5); break; } @@ -295,13 +295,13 @@ function tokenize(tokstream, matchop) { case 108: // l lambda = peek(tokstream, "lambda", "lambda"); if (lambda) { - tokens.push(lambda); + tokens.push($.extend(lambda, [linenum, charnum])); tokstream = tokstream.substr(6); break; } var letexp = peek(tokstream, "let", "let"); if (letexp) { - tokens.push(letexp); + tokens.push($.extend(letexp, [charnum, linenum])); tokstream = tokstream.substr(3); break; }