Commit 10eefb39 by Aaron Leung

Trying to get nested selector groups to expand properly.

parent 748532bb
...@@ -6,7 +6,6 @@ namespace Sass { ...@@ -6,7 +6,6 @@ namespace Sass {
void Document::parse_scss() void Document::parse_scss()
{ {
// cerr << "parse_scss" << endl;
lex<optional_spaces>(); lex<optional_spaces>();
while(*position) { while(*position) {
if (lex< block_comment >()) { if (lex< block_comment >()) {
...@@ -14,6 +13,7 @@ namespace Sass { ...@@ -14,6 +13,7 @@ namespace Sass {
} }
else if (lex< variable >()) { else if (lex< variable >()) {
parse_var_def(); parse_var_def();
lex< exactly<';'> >();
} }
else { else {
statements.push_back(parse_ruleset()); statements.push_back(parse_ruleset());
...@@ -22,29 +22,15 @@ namespace Sass { ...@@ -22,29 +22,15 @@ namespace Sass {
} }
} }
// Node Document::parse_statement()
// {
// if (lex<block_comment>()) {
// return Node(line_number, Node::comment, lexed);
// }
// else if (lex<variable>()) {
// parse_var_def();
// }
// else return parse_ruleset();
// }
void Document::parse_var_def() void Document::parse_var_def()
{ {
// cerr << "parse_var_def" << endl;
const Token key(lexed); const Token key(lexed);
lex< exactly<':'> >(); lex< exactly<':'> >();
environment[key] = parse_values(); environment[key] = parse_values();
lex< exactly<';'> >();
} }
Node Document::parse_ruleset() Node Document::parse_ruleset()
{ {
// cerr << "parse_ruleset" << endl;
Node ruleset(line_number, Node::ruleset, 2); Node ruleset(line_number, Node::ruleset, 2);
ruleset << parse_selector_group(); ruleset << parse_selector_group();
ruleset << parse_block(); ruleset << parse_block();
...@@ -53,7 +39,6 @@ namespace Sass { ...@@ -53,7 +39,6 @@ namespace Sass {
Node Document::parse_selector_group() Node Document::parse_selector_group()
{ {
// cerr << "parse_selector_group" << endl;
Node group(line_number, Node::selector_group, 1); Node group(line_number, Node::selector_group, 1);
group << parse_selector(); group << parse_selector();
while (lex< exactly<','> >()) group << parse_selector(); while (lex< exactly<','> >()) group << parse_selector();
...@@ -62,14 +47,12 @@ namespace Sass { ...@@ -62,14 +47,12 @@ namespace Sass {
Node Document::parse_selector() Node Document::parse_selector()
{ {
// cerr << "parse_selector" << endl;
lex<identifier>(); lex<identifier>();
return Node(line_number, Node::selector, lexed); return Node(line_number, Node::selector, lexed);
} }
Node Document::parse_block() Node Document::parse_block()
{ {
// cerr << "parse_block" << endl;
lex< exactly<'{'> >(); lex< exactly<'{'> >();
bool semicolon = false; bool semicolon = false;
Node block(line_number, Node::block); Node block(line_number, Node::block);
...@@ -80,13 +63,13 @@ namespace Sass { ...@@ -80,13 +63,13 @@ namespace Sass {
if (lex< exactly<'}'> >()) break; if (lex< exactly<'}'> >()) break;
} }
if (lex< block_comment >()) { if (lex< block_comment >()) {
// cerr << "grabbed a comment" << endl;
block << Node(line_number, Node::comment, lexed); block << Node(line_number, Node::comment, lexed);
block.has_rules_or_comments = true; block.has_rules_or_comments = true;
semicolon = true; semicolon = true;
} }
else if (lex< variable >()) { else if (lex< variable >()) {
parse_var_def(); parse_var_def();
semicolon = true;
} }
else if (look_for_rule(position)) { else if (look_for_rule(position)) {
block << parse_rule(); block << parse_rule();
...@@ -100,30 +83,9 @@ namespace Sass { ...@@ -100,30 +83,9 @@ namespace Sass {
else lex< exactly<';'> >(); else lex< exactly<';'> >();
} }
return block; return block;
// lex< identifier >();
// // Token id(lexed);
// if (peek< exactly<':'> >()) {
// Node rule(line_number, Node::rule, 2);
// rule << Node(line_number, Node::property, lexed);
// lex< exactly<':'> >();
// rule << parse_values();
// block << rule;
// block.has_rules = true;
// lex< exactly<';'> >();
// }
// else {
// Node ruleset(line_number, Node::ruleset, 2);
// ruleset << Node(line_number, Node::selector, lexed);
// ruleset << parse_block();
// block << ruleset;
// block.has_rulesets = true;
// }
// }
// return block;
} }
Node Document::parse_rule() { Node Document::parse_rule() {
// cerr << "parse_rule" << endl;
Node rule(line_number, Node::rule, 2); Node rule(line_number, Node::rule, 2);
lex< identifier >(); lex< identifier >();
rule << Node(line_number, Node::property, lexed); rule << Node(line_number, Node::property, lexed);
...@@ -134,7 +96,6 @@ namespace Sass { ...@@ -134,7 +96,6 @@ namespace Sass {
Node Document::parse_values() Node Document::parse_values()
{ {
// cerr << "parse_value" << endl;
Node values(line_number, Node::values); Node values(line_number, Node::values);
while (lex< identifier >() || lex < dimension >() || while (lex< identifier >() || lex < dimension >() ||
lex< percentage >() || lex < number >() || lex< percentage >() || lex < number >() ||
...@@ -155,12 +116,7 @@ namespace Sass { ...@@ -155,12 +116,7 @@ namespace Sass {
char* Document::look_for_rule(char* start) char* Document::look_for_rule(char* start)
{ {
// cerr << "look_for_rule" << endl;
char* p = start ? start : position; char* p = start ? start : position;
// if (p = peek<identifier>(p)) cerr << string(Token(start, p)) << endl;
// if (p = peek<exactly<':'> >(p)) cerr << string(Token(start, p)) << endl;
// if (p = look_for_values(p)) cerr << string(Token(start, p)) << endl;
// if (p = peek< alternatives< exactly<';'>, exactly<'}'> > >(p)) cerr << string(Token(start, p)) << endl;
(p = peek< identifier >(p)) && (p = peek< identifier >(p)) &&
(p = peek< exactly<':'> >(p)) && (p = peek< exactly<':'> >(p)) &&
(p = look_for_values(p)) && (p = look_for_values(p)) &&
...@@ -170,16 +126,13 @@ namespace Sass { ...@@ -170,16 +126,13 @@ namespace Sass {
char* Document::look_for_values(char* start) char* Document::look_for_values(char* start)
{ {
// cerr << "look_for_values" << endl;
char* p = start ? start : position; char* p = start ? start : position;
char* q; char* q;
while ((q = peek< identifier >(p)) || (q = peek< dimension >(p)) || while ((q = peek< identifier >(p)) || (q = peek< dimension >(p)) ||
(q = peek< percentage >(p)) || (q = peek< number >(p)) || (q = peek< percentage >(p)) || (q = peek< number >(p)) ||
(q = peek< hex >(p)) || (q = peek< string_constant >(p)) || (q = peek< hex >(p)) || (q = peek< string_constant >(p)) ||
(q = peek< variable >(p))) (q = peek< variable >(p)))
{ /* cerr << *q; */ p = q; } { p = q; }
// cerr << string(Token(start, p)) << "blah" ;
// cerr << (p == start ? "nothing" : "something") << endl;
return p == start ? 0 : p; return p == start ? 0 : p;
} }
} }
\ No newline at end of file
a, b {
color: red;
background: blue;
}
c, d {
color: gray;
e, f {
background: blue;
padding: 10px 5px;
}
g, h {
blah: blah;
bloo: bloo;
}
i, j {
foo: goo;
k, l {
hoo: boo;
}
}
}
\ No newline at end of file
$x: foo;
\ 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