From 60f3439dbb1c39c3d9e8f9e1b99395db10f25150 Mon Sep 17 00:00:00 2001 From: Marcel Greter Date: Sun, 10 May 2015 17:06:44 +0200 Subject: [PATCH] Improve ie property and expression parsing --- debugger.hpp | 4 ++++ eval.cpp | 3 +-- prelexer.cpp | 2 +- prelexer.hpp | 18 +++++++++++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/debugger.hpp b/debugger.hpp index aaaa914f8f..7b0c599659 100644 --- a/debugger.hpp +++ b/debugger.hpp @@ -450,6 +450,10 @@ inline void debug_ast(AST_Node* node, string ind = "", Env* env = 0) cerr << ind << "Map " << expression; cerr << " (" << pstate_source_position(node) << ")"; cerr << " [Hashed]" << endl; + // for (auto i : expression->elements()) { + // debug_ast(i.first, ind + " key: "); + // debug_ast(i.second, ind + " val: "); + // } } else if (dynamic_cast(node)) { List* expression = dynamic_cast(node); cerr << ind << "List " << expression; diff --git a/eval.cpp b/eval.cpp index f63f711e59..2bd9bac146 100644 --- a/eval.cpp +++ b/eval.cpp @@ -1018,8 +1018,7 @@ namespace Sass { is_rest_argument = false; is_keyword_argument = true; } - else - if(val->concrete_type() != Expression::LIST) { + else if(val->concrete_type() != Expression::LIST) { List* wrapper = new (ctx.mem) List(val->pstate(), 0, List::COMMA, diff --git a/prelexer.cpp b/prelexer.cpp index e13c56d850..485cb7f589 100644 --- a/prelexer.cpp +++ b/prelexer.cpp @@ -606,7 +606,7 @@ namespace Sass { >(src); } const char* ie_expression(const char* src) { - return sequence < word, delimited_by< '(', ')', true> >(src); + return sequence < word, exactly<'('>, skip_over_scopes< exactly<'('>, exactly<')'> > >(src); } const char* ie_property(const char* src) { return alternatives < ie_expression, ie_progid >(src); diff --git a/prelexer.hpp b/prelexer.hpp index 2f7e15a3c0..0b35f59ef4 100644 --- a/prelexer.hpp +++ b/prelexer.hpp @@ -58,7 +58,7 @@ namespace Sass { // recursive skip stuff delimited by start/stop // first start/opener must be consumed already! template - const char* skip_over_scopes(const char* src, const char* end = 0) { + const char* skip_over_scopes(const char* src, const char* end) { size_t level = 0; bool in_squote = false; @@ -85,8 +85,9 @@ namespace Sass { } // find another opener inside? - else if (start(src)) { - ++ level; // increase counter + else if (const char* pos = start(src)) { + ++ level; // increase stack counter + src = pos - 1; // advance position } // look for the closer (maybe final, maybe not) @@ -96,6 +97,8 @@ namespace Sass { // return position at end of stop // delimiter may be multiple chars else return final; + // advance position + src = final - 1; } // next @@ -105,6 +108,15 @@ namespace Sass { return 0; } + // skip to delimiter (mx) inside given range + // this will savely skip over all quoted strings + // recursive skip stuff delimited by start/stop + // first start/opener must be consumed already! + template + const char* skip_over_scopes(const char* src) { + return skip_over_scopes(src, 0); + } + // Match a sequence of characters delimited by the supplied chars. template const char* recursive_scopes(const char* src) {