X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?a=blobdiff_plain;f=code%2Fparse.js;h=8a4761b50be13482cdf30a8be23527b9198aae9d;hb=847feba6f0cf9ca175f3786dbcefacdc3f1cac5a;hp=cb412f7fe523c3d0b7ab1fd98876c14fa11a8955;hpb=df6a6fe6807edabf1b3c3e904eb2ead20eedf0ca;p=lambda.git diff --git a/code/parse.js b/code/parse.js index cb412f7f..8a4761b5 100644 --- a/code/parse.js +++ b/code/parse.js @@ -34,14 +34,14 @@ var make_parse = function () { a = t.type; if (a === "name") { o = symbol_table[v]; - if (o && typeof o !== 'function') { - a = "keyword"; - } else { + if (!o || typeof o === 'function') { o = symbol_table["(name)"]; + } else { + 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,9 +148,15 @@ var make_parse = function () { var x = symbol(s); x.handler = function () { this.value = symbol_table[this.id].value; - this.arity = "literal"; - return this; + if (this.first) { + return make_app(this.first.handler(), this.value); + } else { + return this.value; + } }; + // 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;