Skip to content

Commit

Permalink
Merge branch 'hs_cf_parser' into ast-branch
Browse files Browse the repository at this point in the history
  • Loading branch information
Mikael Bung committed Feb 24, 2010
2 parents 764140d + a0ba9e5 commit 18dec16
Show file tree
Hide file tree
Showing 6 changed files with 1,072 additions and 824 deletions.
28 changes: 14 additions & 14 deletions haskell.abs.js
@@ -1,15 +1,15 @@
haskell.abs.Program = function() {

};

haskell.abs.Statement = function() {

};

haskell.abs.Expression = function() {

};

haskell.abs.Value = function() {

haskell.abs.Program = function() {

};

haskell.abs.Statement = function() {

};

haskell.abs.Expression = function() {

};

haskell.abs.Value = function() {

}
134 changes: 67 additions & 67 deletions haskell.interpreter.js
@@ -1,68 +1,68 @@
function isInteger(x) {
var y = parseInt(x);
if (isNaN(y)) {
return false;
}
return x== y && x.toString() == y.toString();
}

haskell.interpreter.interpret = function(env, ast) {
var interpret = haskell.interpreter.interpret;

if(ast.fun_name != undefined) {
// eval function
var f = env.get_symbol(ast.fun_name);
env.set_arg_list(ast.arguments);
var result = interpret(env, f.value);
return result;
} else if (ast.arguments != undefined) {
for (var i = 0; i < ast.arguments.length; i++) {
var arg = ast.arguments[i];

if (env.arg_list.length > i) {
var value = env.arg_list[i];
value = value.toString();
value = haskell.parser.parse(value, true).ast;
env.set_symbol(arg, value, false);
} else if (!env.exists_symbol(arg)) {
var value = prompt("enter a value for " + arg);
value = haskell.parser.parse(value, false).ast;
env.set_symbol(arg, value, false);
}
}

return interpret(env, ast.expr);
} else if (ast.symbol != undefined) {
switch (ast.symbol) {
case '+':
return interpret(env, ast.lhs) + interpret(env, ast.rhs);
break;
case '-':
return interpret(env, ast.lhs) - interpret(env, ast.rhs);
break;
case '*':
return interpret(env, ast.lhs) * interpret(env, ast.rhs);
break;
case '/':
return interpret(env, ast.lhs) / interpret(env, ast.rhs);
break;
default:
console.log("unknown symbol %o ast: %o", ast.symbol, ast);
break;
}
} else {
if (isInteger(ast)) {
return ast;
} else {
// ast is a symbol so look it up
var symbol = env.get_symbol(ast);
if (symbol.evaluated) {
return symbol.value;
} else {
var result = interpret(new haskell.env(), symbol.value);
env.set_symbol(ast, result, true);
return result;
}
}
}
function isInteger(x) {
var y = parseInt(x);
if (isNaN(y)) {
return false;
}
return x== y && x.toString() == y.toString();
}

haskell.interpreter.interpret = function(env, ast) {
var interpret = haskell.interpreter.interpret;

if(ast.fun_name != undefined) {
// eval function
var f = env.get_symbol(ast.fun_name);
env.set_arg_list(ast.arguments);
var result = interpret(env, f.value);
return result;
} else if (ast.arguments != undefined) {
for (var i = 0; i < ast.arguments.length; i++) {
var arg = ast.arguments[i];

if (env.arg_list.length > i) {
var value = env.arg_list[i];
value = value.toString();
value = haskell.parser.parse(value, true).ast;
env.set_symbol(arg, value, false);
} else if (!env.exists_symbol(arg)) {
var value = prompt("enter a value for " + arg);
value = haskell.parser.parse(value, false).ast;
env.set_symbol(arg, value, false);
}
}

return interpret(env, ast.expr);
} else if (ast.symbol != undefined) {
switch (ast.symbol) {
case '+':
return interpret(env, ast.lhs) + interpret(env, ast.rhs);
break;
case '-':
return interpret(env, ast.lhs) - interpret(env, ast.rhs);
break;
case '*':
return interpret(env, ast.lhs) * interpret(env, ast.rhs);
break;
case '/':
return interpret(env, ast.lhs) / interpret(env, ast.rhs);
break;
default:
console.log("unknown symbol %o ast: %o", ast.symbol, ast);
break;
}
} else {
if (isInteger(ast)) {
return ast;
} else {
// ast is a symbol so look it up
var symbol = env.get_symbol(ast);
if (symbol.evaluated) {
return symbol.value;
} else {
var result = interpret(new haskell.env(), symbol.value);
env.set_symbol(ast, result, true);
return result;
}
}
}
}
6 changes: 3 additions & 3 deletions haskell.js
@@ -1,7 +1,7 @@
var haskell = {
parser: {},
interpreter: {},
abs: {}
interpreter: {},
ast: {}
};

haskell.env = function() {
Expand Down Expand Up @@ -38,4 +38,4 @@ haskell.eval = function(code) {
var ast = haskell.parser.parse(code).ast;
console.log("%o", ast);
return haskell.interpreter.interpret(new haskell.env(), ast);
};
};

0 comments on commit 18dec16

Please sign in to comment.