X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?a=blobdiff_plain;f=code%2Fparse.js;h=8a4761b50be13482cdf30a8be23527b9198aae9d;hb=847feba6f0cf9ca175f3786dbcefacdc3f1cac5a;hp=7749c69582554b3ce9fc8f2e9ec1a0eb87d8f849;hpb=d3ad170e4366d7e6e33b27e83d9bcc244fe43988;p=lambda.git diff --git a/code/parse.js b/code/parse.js index 7749c695..8a4761b5 100644 --- a/code/parse.js +++ b/code/parse.js @@ -40,8 +40,8 @@ var make_parse = function () { a = o.arity || "keyword"; } } else if (a === "number") { - o = symbol_table["(literal)"]; - a = "literal"; + o = symbol_table["(number)"]; + a = "literal"; } else if (a === "operator") { o = symbol_table[v]; if (!o) { @@ -79,7 +79,6 @@ var make_parse = function () { s = Object.create(original_symbol); s.id = s.value = id; symbol_table[id] = s; - print(s, s.arity); } return s; }; @@ -127,14 +126,13 @@ var make_parse = function () { return body; }; + var number_handler = function () { - var itself = function () { - return this; }; symbol("(end)"); symbol("(name)").handler = name_handler; - symbol("(literal)").handler = itself; + symbol("(number)").handler = number_handler; symbol("let").handler = lambda_handler; symbol("=").handler = branch_handler; symbol("in"); @@ -150,10 +148,16 @@ var make_parse = function () { var x = symbol(s); x.handler = function () { this.value = symbol_table[this.id].value; - return this; + if (this.first) { + return make_app(this.first.handler(), this.value); + } else { + return this.value; + } }; - x.value = v; + // constants have their own id and arity = literal + // numbers have id = "(number)" and arity = literal x.arity = "literal"; + x.value = v; return x; }; @@ -213,7 +217,11 @@ var make_parse = function () { n = token; advance(); } - if (token.id === ".") { + if (token.arity === "literal" && t.first.length === 0) { + t.first.push(n); + t.second = token; + advance(); + } else if (token.id === ".") { t.first.push(n); advance(); t.second = expression(in_let); @@ -249,8 +257,8 @@ var make_parse = function () { n = token; advance(")"); } else { - if (token.arity !== "name") { - token.error("Expected a variable name."); + if (token.arity !== "name" && token.arity !== "literal") { + token.error("Expected a variable name or literal."); } token.first = n; n = token;