Commit aba60c5c by Aaron Leung

Handling unary + and -. Makes more tests pass.

parent 58972fe7
......@@ -655,6 +655,18 @@ namespace Sass {
if (!lex< exactly<')'> >()) syntax_error("unclosed parenthesis");
return value;
}
else if (lex< exactly<'+'> >()) {
Node plus(Node::unary_plus, context.registry, line_number, 1);
plus << parse_factor();
plus.eval_me = true;
return plus;
}
else if (lex< exactly<'-'> >()) {
Node minus(Node::unary_minus, context.registry, line_number, 1);
minus << parse_factor();
minus.eval_me = true;
return minus;
}
else {
return parse_value();
}
......
......@@ -223,6 +223,26 @@ namespace Sass {
return apply_function(f_env[sig], expr[1], env, f_env, registry);
} break;
case Node::unary_plus: {
Node arg(eval(expr[0], env, f_env, registry));
if (arg.is_numeric()) return arg;
else {
expr[0] = arg;
return expr;
}
} break;
case Node::unary_minus: {
Node arg(eval(expr[0], env, f_env, registry));
if (arg.is_numeric()) {
arg.set_numeric_value(-arg.numeric_value());
}
else {
expr[0] = arg;
return expr;
}
} break;
case Node::string_schema:
case Node::value_schema: {
cerr << "evaluating schema of size " << expr.size() << endl;
......
......@@ -174,6 +174,20 @@ namespace Sass {
return "/";
} break;
case unary_plus: {
stringstream ss;
ss << "+";
ss << at(0).to_string("");
return ss.str();
}
case unary_minus: {
stringstream ss;
ss << "-";
ss << at(0).to_string("");
return ss.str();
}
case numeric_percentage: {
stringstream ss;
ss << content.dimension.numeric_value;
......
......@@ -59,6 +59,8 @@ namespace Sass {
div,
factor,
unary_plus,
unary_minus,
values,
value,
identifier,
......@@ -170,6 +172,21 @@ namespace Sass {
}
}
void set_numeric_value(double v)
{
switch (type)
{
case number:
case numeric_percentage:
content.numeric_value = v;
case numeric_dimension:
content.dimension.numeric_value = v;
default:
break;
// throw an exception?
}
}
Node& operator+=(const Node& n)
{
for (int i = 0; i < n.size(); ++i) {
......
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