Commit f0945040 by Aaron Leung

Parsing back-references (i.e., the ampersand).

parent b8630d7c
/*hey, ho {
& > boo, foo &.goo {
bloo: bloo;
}
blah: blah;
}
*/
div {
a: a;
p {
b: b;
&* {
c: c;
}
}
}
\ No newline at end of file
......@@ -53,25 +53,59 @@ namespace Sass {
lex< exactly<'>'> >()) {
selector << Node(line_number, Node::selector_combinator, lexed);
}
selector << parse_simple_selector_sequence();
Node s(parse_simple_selector_sequence());
if (s.has_backref) selector.has_backref = true;
selector << s;
// if (s.terminal_backref) return selector;
while (lex< exactly<'+'> >() ||
lex< exactly<'~'> >() ||
lex< exactly<'>'> >() ||
lex< ancestor_of >()) {
lex< ancestor_of >() ||
s.terminal_backref && lex< no_spaces >()) {
selector << Node(line_number, Node::selector_combinator, lexed);
selector << parse_simple_selector_sequence();
s = parse_simple_selector_sequence();
if (s.has_backref) selector.has_backref = true;
selector << s;
// if (s.terminal_backref) break;
}
// while (1) {
// if (lex< exactly<'+'> >() || lex< exactly<'~'> >() ||
// lex< exactly<'>'> >() || lex< ancestor_of >()) {
// selector << Node(line_number, Node::selector_combinator, lexed);
// Node s(parse_simple_selector_sequence());
// if (s.has_backref) selector.has_backref = true;
// selector << s;
// }
// else if (selector.children->back().has_backref &&
// selector.children->back().children->size() == 1 &&
// lex< alternatives < type_selector, universal > >()) {
// Node s(parse_simple_selector_sequence());
// if (s.has_backref) selector.has_backref = true;
// selector << s;
// }
// else break;
// }
return selector;
}
Node Document::parse_simple_selector_sequence()
{
Node sequence(line_number, Node::simple_selector_sequence, 1);
Node seq(line_number, Node::simple_selector_sequence, 1);
if (lex< alternatives < type_selector, universal > >()) {
sequence << Node(line_number, Node::simple_selector, lexed);
seq << Node(line_number, Node::simple_selector, lexed);
}
else if (lex< exactly<'&'> >()) {
seq << Node(line_number, Node::backref, lexed);
seq.has_backref = true;
if (peek< sequence< no_spaces, alternatives< type_selector, universal > > >(position)) {
cerr << "Terminal backref!" << endl;
seq.terminal_backref = true;
return seq;
}
}
else {
sequence << parse_simple_selector();
seq << parse_simple_selector();
}
while (!peek< spaces >(position) &&
!(peek < exactly<'+'> >(position) ||
......@@ -79,9 +113,9 @@ namespace Sass {
peek < exactly<'>'> >(position) ||
peek < exactly<','> >(position) ||
peek < exactly<'{'> >(position))) {
sequence << parse_simple_selector();
seq << parse_simple_selector();
}
return sequence;
return seq;
}
Node Document::parse_simple_selector()
......
......@@ -17,6 +17,7 @@ namespace Sass {
selector,
selector_combinator,
simple_selector_sequence,
backref,
simple_selector,
type_selector,
class_selector,
......@@ -41,6 +42,8 @@ namespace Sass {
bool has_rules_or_comments;
bool has_rulesets;
bool has_propsets;
bool has_backref;
bool terminal_backref;
Node() : type(nil), children(0) { ++fresh; }
......@@ -51,7 +54,9 @@ namespace Sass {
type(n.type),
has_rules_or_comments(n.has_rules_or_comments),
has_rulesets(n.has_rulesets),
has_propsets(n.has_propsets)
has_propsets(n.has_propsets),
has_backref(n.has_backref),
terminal_backref(n.terminal_backref)
{ /*n.release();*/ ++copied; } // No joint custody.
Node(size_t line_number, Type type, size_t length = 0)
......@@ -61,7 +66,9 @@ namespace Sass {
type(type),
has_rules_or_comments(false),
has_rulesets(false),
has_propsets(false)
has_propsets(false),
has_backref(false),
terminal_backref(false)
{ children->reserve(length); ++fresh; }
Node(size_t line_number, Type type, const Node& n)
......@@ -71,7 +78,9 @@ namespace Sass {
type(type),
has_rules_or_comments(false),
has_rulesets(false),
has_propsets(false)
has_propsets(false),
has_backref(false),
terminal_backref(false)
{ ++fresh; }
Node(size_t line_number, Type type, const Node& n, const Node& m)
......@@ -81,7 +90,9 @@ namespace Sass {
type(type),
has_rules_or_comments(false),
has_rulesets(false),
has_propsets(false)
has_propsets(false),
has_backref(false),
terminal_backref(false)
{
children->reserve(2);
children->push_back(n);
......@@ -96,7 +107,9 @@ namespace Sass {
type(type),
has_rules_or_comments(false),
has_rulesets(false),
has_propsets(false)
has_propsets(false),
has_backref(false),
terminal_backref(false)
{ ++fresh; }
//~Node() { delete children; }
......@@ -111,6 +124,8 @@ namespace Sass {
has_rules_or_comments = n.has_rules_or_comments;
has_rulesets = n.has_rulesets;
has_propsets = n.has_propsets;
has_backref = n.has_backref;
terminal_backref = n.terminal_backref;
++copied;
return *this;
}
......
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