Commit 19be8eea by Aaron Leung

New environment data structure works. All tests passing.

parent 607058ec
#define SASS_CONTEXT_INCLUDED
namespace Sass { namespace Sass {
using std::map; using std::map;
......
...@@ -13,13 +13,13 @@ namespace Sass { ...@@ -13,13 +13,13 @@ namespace Sass {
Node val(n[1]); Node val(n[1]);
if (val.type == Node::comma_list || val.type == Node::space_list) { if (val.type == Node::comma_list || val.type == Node::space_list) {
for (int i = 0; i < val.size(); ++i) { 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 { 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; } break;
case Node::rule: { case Node::rule: {
...@@ -27,20 +27,20 @@ namespace Sass { ...@@ -27,20 +27,20 @@ namespace Sass {
Node rhs(n[1]); Node rhs(n[1]);
if (rhs.type == Node::comma_list || rhs.type == Node::space_list) { if (rhs.type == Node::comma_list || rhs.type == Node::space_list) {
for (int i = 0; i < rhs.size(); ++i) { 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 { else {
n[1] = eval(n[1], context.environment); n[1] = eval(n[1], context.global_env);
} }
} break; } break;
case Node::mixin: { case Node::mixin: {
context.environment[n[0].token] = n; context.global_env[n[0].token] = n;
} break; } break;
case Node::expansion: { 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.children->pop_back(); n.children->pop_back();
n += body; n += body;
......
...@@ -161,7 +161,7 @@ namespace Sass { ...@@ -161,7 +161,7 @@ namespace Sass {
// Node evaled(eval(val)); // Node evaled(eval(val));
// evaled.from_variable = true; // evaled.from_variable = true;
// val.eval_me = true; // val.eval_me = true;
// context.environment[key] = evaled; // context.global_env[key] = evaled;
} }
Node Document::parse_ruleset(bool definition) Node Document::parse_ruleset(bool definition)
......
...@@ -5,25 +5,25 @@ ...@@ -5,25 +5,25 @@
namespace Sass { namespace Sass {
using std::cerr; using std::endl; 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) switch (expr.type)
{ {
case Node::comma_list: case Node::comma_list:
case Node::space_list: { case Node::space_list: {
if (expr.eval_me) { if (expr.eval_me) {
// *(expr.children->begin()) = eval(expr[0], g_env); // *(expr.children->begin()) = eval(expr[0], env);
expr[0] = eval(expr[0], g_env); expr[0] = eval(expr[0], env);
} }
return expr; return expr;
} break; } break;
case Node::expression: { case Node::expression: {
Node acc(expr.line_number, Node::expression, eval(expr[0], g_env)); Node acc(expr.line_number, Node::expression, eval(expr[0], env));
Node rhs(eval(expr[2], g_env)); Node rhs(eval(expr[2], env));
accumulate(expr[1].type, acc, rhs); accumulate(expr[1].type, acc, rhs);
for (int i = 3; i < expr.size(); i += 2) { 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); accumulate(expr[i].type, acc, rhs);
} }
return acc.size() == 1 ? acc[0] : acc; return acc.size() == 1 ? acc[0] : acc;
...@@ -31,11 +31,11 @@ namespace Sass { ...@@ -31,11 +31,11 @@ namespace Sass {
case Node::term: { case Node::term: {
if (expr.eval_me) { if (expr.eval_me) {
Node acc(expr.line_number, Node::expression, eval(expr[0], g_env)); Node acc(expr.line_number, Node::expression, eval(expr[0], env));
Node rhs(eval(expr[2], g_env)); Node rhs(eval(expr[2], env));
accumulate(expr[1].type, acc, rhs); accumulate(expr[1].type, acc, rhs);
for (int i = 3; i < expr.size(); i += 2) { 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); accumulate(expr[i].type, acc, rhs);
} }
return acc.size() == 1 ? acc[0] : acc; return acc.size() == 1 ? acc[0] : acc;
...@@ -75,7 +75,7 @@ namespace Sass { ...@@ -75,7 +75,7 @@ namespace Sass {
} break; } break;
case Node::variable: { case Node::variable: {
return g_env[expr.token]; return env[expr.token];
} break; } break;
default: { default: {
......
...@@ -4,10 +4,14 @@ ...@@ -4,10 +4,14 @@
#include "node.hpp" #include "node.hpp"
#endif #endif
#ifndef SASS_CONTEXT_INCLUDED
#include "context.hpp"
#endif
namespace Sass { namespace Sass {
using std::map; 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); Node accumulate(const Node::Type op, Node& acc, Node& rhs);
double operate(const Node::Type op, double lhs, double 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