Commit 19be8eea by Aaron Leung

New environment data structure works. All tests passing.

parent 607058ec
#define SASS_CONTEXT_INCLUDED
namespace Sass {
using std::map;
......
......@@ -13,13 +13,13 @@ namespace Sass {
Node val(n[1]);
if (val.type == Node::comma_list || val.type == Node::space_list) {
for (int i = 0; i < val.size(); ++i) {
if (val[i].eval_me) val[i] = eval(val[i], context.environment);
if (val[i].eval_me) val[i] = eval(val[i], context.global_env);
}
}
else {
val = eval(val, context.environment);
val = eval(val, context.global_env);
}
context.environment[n[0].token] = val;
context.global_env[n[0].token] = val;
} break;
case Node::rule: {
......@@ -27,20 +27,20 @@ namespace Sass {
Node rhs(n[1]);
if (rhs.type == Node::comma_list || rhs.type == Node::space_list) {
for (int i = 0; i < rhs.size(); ++i) {
if (rhs[i].eval_me) rhs[i] = eval(rhs[i], context.environment);
if (rhs[i].eval_me) rhs[i] = eval(rhs[i], context.global_env);
}
}
else {
n[1] = eval(n[1], context.environment);
n[1] = eval(n[1], context.global_env);
}
} break;
case Node::mixin: {
context.environment[n[0].token] = n;
context.global_env[n[0].token] = n;
} break;
case Node::expansion: {
Node body(context.environment[n[0].token][2].clone());
Node body(context.global_env[n[0].token][2].clone());
n.children->pop_back();
n.children->pop_back();
n += body;
......
......@@ -161,7 +161,7 @@ namespace Sass {
// Node evaled(eval(val));
// evaled.from_variable = true;
// val.eval_me = true;
// context.environment[key] = evaled;
// context.global_env[key] = evaled;
}
Node Document::parse_ruleset(bool definition)
......
......@@ -5,25 +5,25 @@
namespace Sass {
using std::cerr; using std::endl;
Node eval(const Node& expr, map<Token, Node>& g_env)
Node eval(const Node& expr, Environment& env)
{
switch (expr.type)
{
case Node::comma_list:
case Node::space_list: {
if (expr.eval_me) {
// *(expr.children->begin()) = eval(expr[0], g_env);
expr[0] = eval(expr[0], g_env);
// *(expr.children->begin()) = eval(expr[0], env);
expr[0] = eval(expr[0], env);
}
return expr;
} break;
case Node::expression: {
Node acc(expr.line_number, Node::expression, eval(expr[0], g_env));
Node rhs(eval(expr[2], g_env));
Node acc(expr.line_number, Node::expression, eval(expr[0], env));
Node rhs(eval(expr[2], env));
accumulate(expr[1].type, acc, rhs);
for (int i = 3; i < expr.size(); i += 2) {
Node rhs(eval(expr[i+1], g_env));
Node rhs(eval(expr[i+1], env));
accumulate(expr[i].type, acc, rhs);
}
return acc.size() == 1 ? acc[0] : acc;
......@@ -31,11 +31,11 @@ namespace Sass {
case Node::term: {
if (expr.eval_me) {
Node acc(expr.line_number, Node::expression, eval(expr[0], g_env));
Node rhs(eval(expr[2], g_env));
Node acc(expr.line_number, Node::expression, eval(expr[0], env));
Node rhs(eval(expr[2], env));
accumulate(expr[1].type, acc, rhs);
for (int i = 3; i < expr.size(); i += 2) {
Node rhs(eval(expr[i+1], g_env));
Node rhs(eval(expr[i+1], env));
accumulate(expr[i].type, acc, rhs);
}
return acc.size() == 1 ? acc[0] : acc;
......@@ -75,7 +75,7 @@ namespace Sass {
} break;
case Node::variable: {
return g_env[expr.token];
return env[expr.token];
} break;
default: {
......
......@@ -4,10 +4,14 @@
#include "node.hpp"
#endif
#ifndef SASS_CONTEXT_INCLUDED
#include "context.hpp"
#endif
namespace Sass {
using std::map;
Node eval(const Node& expr, map<Token, Node>& g_env);
Node eval(const Node& expr, Environment& env);
Node accumulate(const Node::Type op, Node& acc, Node& rhs);
double operate(const Node::Type op, double lhs, double rhs);
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment