projects
/
lambda.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tweak lambda evaluator
[lambda.git]
/
code
/
parse.js
diff --git
a/code/parse.js
b/code/parse.js
index
7749c69
..
8a4761b
100644
(file)
--- a/
code/parse.js
+++ b/
code/parse.js
@@
-40,8
+40,8
@@
var make_parse = function () {
a = o.arity || "keyword";
}
} else if (a === "number") {
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) {
} 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;
s = Object.create(original_symbol);
s.id = s.value = id;
symbol_table[id] = s;
- print(s, s.arity);
}
return s;
};
}
return s;
};
@@
-127,14
+126,13
@@
var make_parse = function () {
return body;
};
return body;
};
+ var number_handler = function () {
- var itself = function () {
- return this;
};
symbol("(end)");
symbol("(name)").handler = name_handler;
};
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");
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;
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.arity = "literal";
+ x.value = v;
return x;
};
return x;
};
@@
-213,7
+217,11
@@
var make_parse = function () {
n = token;
advance();
}
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);
t.first.push(n);
advance();
t.second = expression(in_let);
@@
-249,8
+257,8
@@
var make_parse = function () {
n = token;
advance(")");
} else {
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;
}
token.first = n;
n = token;