Commit aba60c5c by Aaron Leung

Handling unary + and -. Makes more tests pass.

parent 58972fe7
...@@ -655,6 +655,18 @@ namespace Sass { ...@@ -655,6 +655,18 @@ namespace Sass {
if (!lex< exactly<')'> >()) syntax_error("unclosed parenthesis"); if (!lex< exactly<')'> >()) syntax_error("unclosed parenthesis");
return value; 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 { else {
return parse_value(); return parse_value();
} }
......
...@@ -223,6 +223,26 @@ namespace Sass { ...@@ -223,6 +223,26 @@ namespace Sass {
return apply_function(f_env[sig], expr[1], env, f_env, registry); return apply_function(f_env[sig], expr[1], env, f_env, registry);
} break; } 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::string_schema:
case Node::value_schema: { case Node::value_schema: {
cerr << "evaluating schema of size " << expr.size() << endl; cerr << "evaluating schema of size " << expr.size() << endl;
......
...@@ -174,6 +174,20 @@ namespace Sass { ...@@ -174,6 +174,20 @@ namespace Sass {
return "/"; return "/";
} break; } 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: { case numeric_percentage: {
stringstream ss; stringstream ss;
ss << content.dimension.numeric_value; ss << content.dimension.numeric_value;
......
...@@ -59,6 +59,8 @@ namespace Sass { ...@@ -59,6 +59,8 @@ namespace Sass {
div, div,
factor, factor,
unary_plus,
unary_minus,
values, values,
value, value,
identifier, identifier,
...@@ -170,6 +172,21 @@ namespace Sass { ...@@ -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) Node& operator+=(const Node& n)
{ {
for (int i = 0; i < n.size(); ++i) { 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