Commit 059ce633 by Aaron Leung

More refactoring.

parent 4fa3b14c
......@@ -5,50 +5,59 @@ namespace Sass {
void Document::eval_pending()
{
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: {
// 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;
eval(context.pending[i], context.global_env);
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;
}
// 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;
// //
// // 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 @@
namespace Sass {
using std::cerr; using std::endl;
Node eval(const Node& expr, Environment& env)
Node eval(Node& expr, Environment& env)
{
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: {
Node rhs(expr[1]);
if (rhs.type == Node::comma_list || rhs.type == Node::space_list) {
......@@ -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());
double lnum = lhs.numeric_value;
......@@ -174,7 +203,7 @@ namespace Sass {
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
switch (op)
......@@ -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 body(mixin[2].clone());
......
......@@ -11,9 +11,9 @@
namespace Sass {
using std::map;
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);
Node eval(Node& expr, Environment& env);
Node accumulate(Node::Type op, Node& acc, Node& 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