Commit 059ce633 by Aaron Leung

More refactoring.

parent 4fa3b14c
...@@ -5,50 +5,59 @@ namespace Sass { ...@@ -5,50 +5,59 @@ namespace Sass {
void Document::eval_pending() void Document::eval_pending()
{ {
for (int i = 0; i < context.pending.size(); ++i) { for (int i = 0; i < context.pending.size(); ++i) {
Node n(context.pending[i]);
switch (n.type)
{
case Node::assignment: {
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.global_env);
}
}
else {
val = eval(val, context.global_env);
}
context.global_env[n[0].token] = val;
} break;
case Node::rule: { eval(context.pending[i], context.global_env);
// treat top-level lists differently from nested ones
// 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.global_env);
// }
// }
// else {
// n[1] = eval(n[1], context.global_env);
// }
eval(n, context.global_env);
} break;
case Node::mixin: {
context.global_env[n[0].token] = n;
} break;
case Node::expansion: { // Node n(context.pending[i]);
Token name(n[0].token); // switch (n.type)
Node args(n[1]); // {
Node mixin(context.global_env[name]); // // case Node::assignment: {
n.children->pop_back(); // // // Node val(n[1]);
n.children->pop_back(); // // // if (val.type == Node::comma_list || val.type == Node::space_list) {
n += apply(mixin, args, context.global_env); // // // for (int i = 0; i < val.size(); ++i) {
} break; // // // if (val[i].eval_me) val[i] = eval(val[i], context.global_env);
} // // // }
// // // }
// // // else {
// // // val = eval(val, context.global_env);
// // // }
// // // context.global_env[n[0].token] = val;
// //
// // eval(n, context.global_env);
// // } break;
// //
// // case Node::rule: {
// // // treat top-level lists differently from nested ones
// // // 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.global_env);
// // // }
// // // }
// // // else {
// // // n[1] = eval(n[1], context.global_env);
// // // }
// //
// // eval(n, context.global_env);
// // } break;
// //
// // case Node::mixin: {
// // // context.global_env[n[0].token] = n;
// //
// // eval(n, context.global_env);
// // } break;
//
// // case Node::expansion: {
// // Token name(n[0].token);
// // Node args(n[1]);
// // Node mixin(context.global_env[name]);
// // n.children->pop_back();
// // n.children->pop_back();
// // n += apply(mixin, args, context.global_env);
// // } break;
//
// default: eval(n, context.global_env);
// }
} }
} }
} }
\ No newline at end of file
...@@ -5,10 +5,39 @@ ...@@ -5,10 +5,39 @@
namespace Sass { namespace Sass {
using std::cerr; using std::endl; using std::cerr; using std::endl;
Node eval(const Node& expr, Environment& env) Node eval(Node& expr, Environment& env)
{ {
switch (expr.type) switch (expr.type)
{ {
case Node::mixin: {
env[expr[0].token] = expr;
return expr;
} break;
case Node::expansion: {
Token name(expr[0].token);
Node args(expr[1]);
Node mixin(env[name]);
expr.children->pop_back();
expr.children->pop_back();
expr += apply(mixin, args, env);
return expr;
} break;
case Node::assignment: {
Node val(expr[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], env);
}
}
else {
val = eval(val, env);
}
env[expr[0].token] = val;
return expr;
} break;
case Node::rule: { case Node::rule: {
Node rhs(expr[1]); Node rhs(expr[1]);
if (rhs.type == Node::comma_list || rhs.type == Node::space_list) { if (rhs.type == Node::comma_list || rhs.type == Node::space_list) {
...@@ -97,7 +126,7 @@ namespace Sass { ...@@ -97,7 +126,7 @@ namespace Sass {
} }
} }
Node accumulate(const Node::Type op, Node& acc, Node& rhs) Node accumulate(Node::Type op, Node& acc, Node& rhs)
{ {
Node lhs(acc.children->back()); Node lhs(acc.children->back());
double lnum = lhs.numeric_value; double lnum = lhs.numeric_value;
...@@ -174,7 +203,7 @@ namespace Sass { ...@@ -174,7 +203,7 @@ namespace Sass {
return acc; return acc;
} }
double operate(const Node::Type op, double lhs, double rhs) double operate(Node::Type op, double lhs, double rhs)
{ {
// TO DO: check for division by zero // TO DO: check for division by zero
switch (op) switch (op)
...@@ -187,7 +216,7 @@ namespace Sass { ...@@ -187,7 +216,7 @@ namespace Sass {
} }
} }
Node apply(const Node& mixin, const Node& args, Environment& env) Node apply(Node& mixin, const Node& args, Environment& env)
{ {
Node params(mixin[1]); Node params(mixin[1]);
Node body(mixin[2].clone()); Node body(mixin[2].clone());
......
...@@ -11,9 +11,9 @@ ...@@ -11,9 +11,9 @@
namespace Sass { namespace Sass {
using std::map; using std::map;
Node eval(const Node& expr, Environment& env); Node eval(Node& expr, Environment& env);
Node accumulate(const Node::Type op, Node& acc, Node& rhs); Node accumulate(Node::Type op, Node& acc, Node& rhs);
double operate(const Node::Type op, double lhs, double rhs); double operate(Node::Type op, double lhs, double rhs);
Node apply(const Node& mixin, const Node& args, Environment& env); Node apply(Node& mixin, const Node& args, Environment& env);
} }
\ 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