summaryrefslogtreecommitdiff
path: root/css/parser.y
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2003-11-19 19:57:11 +0000
committerJames Bursa <james@netsurf-browser.org>2003-11-19 19:57:11 +0000
commit9472e0c668e69a6a636a321fb15826ab0a797d62 (patch)
treec5df44e8e4b4437ac31b18c3d1a36e090760080a /css/parser.y
parent64941a66d2474e414ca0d4bbe92f106d8a5e0c7a (diff)
downloadnetsurf-9472e0c668e69a6a636a321fb15826ab0a797d62.tar.gz
netsurf-9472e0c668e69a6a636a321fb15826ab0a797d62.tar.bz2
[project @ 2003-11-19 19:57:11 by bursa]
Minor improvements to the parser. svn path=/import/netsurf/; revision=419
Diffstat (limited to 'css/parser.y')
-rw-r--r--css/parser.y70
1 files changed, 40 insertions, 30 deletions
diff --git a/css/parser.y b/css/parser.y
index 9fc1d398d..29767b546 100644
--- a/css/parser.y
+++ b/css/parser.y
@@ -82,54 +82,61 @@ css_combinator(A) ::= GT.
simple_selector(A) ::= element_name(B) detail_list(C).
{ A = css_new_node(CSS_NODE_SELECTOR, B, C, 0);
- A->specificity = (B ? 1 : 0) + (C ? C->specificity : 0); }
+ A->specificity = 1 + C->specificity; }
+simple_selector(A) ::= element_name(B).
+ { A = css_new_node(CSS_NODE_SELECTOR, B, 0, 0);
+ A->specificity = 1; }
+simple_selector(A) ::= detail_list(C).
+ { A = css_new_node(CSS_NODE_SELECTOR, 0, C, 0);
+ A->specificity = C->specificity; }
-element_name(A) ::= . [EMPTYIDENT]
- { A = 0; }
element_name(A) ::= IDENT(B).
{ A = B; }
-detail_list(A) ::= .
- { A = 0; }
-detail_list(A) ::= HASH(B) detail_list(C).
+detail_list(A) ::= detail(B).
+ { A = B; }
+detail_list(A) ::= detail(B) detail_list(C).
+ { A = B; A->specificity += C->specificity; A->next = C; }
+
+detail(A) ::= HASH(B).
{ A = css_new_node(CSS_NODE_ID, B, 0, 0);
- A->specificity = 0x10000 + (C ? C->specificity : 0); A->next = C; }
-detail_list(A) ::= DOT IDENT(B) detail_list(C).
+ A->specificity = 0x10000; }
+detail(A) ::= DOT IDENT(B).
{ A = css_new_node(CSS_NODE_CLASS, B, 0, 0);
- A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C; }
-detail_list(A) ::= LBRAC IDENT(B) RBRAC detail_list(C).
+ A->specificity = 0x100; }
+detail(A) ::= LBRAC IDENT(B) RBRAC.
{ A = css_new_node(CSS_NODE_ATTRIB, B, 0, 0);
- A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C; }
-detail_list(A) ::= LBRAC IDENT(B) EQUALS IDENT(C) RBRAC detail_list(D).
+ A->specificity = 0x100; }
+detail(A) ::= LBRAC IDENT(B) EQUALS IDENT(C) RBRAC.
{ A = css_new_node(CSS_NODE_ATTRIB_EQ, B, 0, 0); A->data2 = C;
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) EQUALS STRING(C) RBRAC detail_list(D).
+ A->specificity = 0x100; }
+detail(A) ::= LBRAC IDENT(B) EQUALS STRING(C) RBRAC.
{ A = css_new_node(CSS_NODE_ATTRIB_EQ, B, 0, 0); A->data2 = css_unquote(C);
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) INCLUDES IDENT(C) RBRAC detail_list(D).
+ A->specificity = 0x100; }
+detail(A) ::= LBRAC IDENT(B) INCLUDES IDENT(C) RBRAC.
{ A = css_new_node(CSS_NODE_ATTRIB_INC, B, 0, 0); A->data2 = C;
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) INCLUDES STRING(C) RBRAC detail_list(D).
+ A->specificity = 0x100; }
+detail(A) ::= LBRAC IDENT(B) INCLUDES STRING(C) RBRAC.
{ A = css_new_node(CSS_NODE_ATTRIB_INC, B, 0, 0); A->data2 = css_unquote(C);
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) DASHMATCH IDENT(C) RBRAC detail_list(D).
+ A->specificity = 0x100; }
+detail(A) ::= LBRAC IDENT(B) DASHMATCH IDENT(C) RBRAC.
{ A = css_new_node(CSS_NODE_ATTRIB_DM, B, 0, 0); A->data2 = C;
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) DASHMATCH STRING(C) RBRAC detail_list(D).
+ A->specificity = 0x100; }
+detail(A) ::= LBRAC IDENT(B) DASHMATCH STRING(C) RBRAC.
{ A = css_new_node(CSS_NODE_ATTRIB_DM, B, 0, 0); A->data2 = css_unquote(C);
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= COLON IDENT(B) detail_list(C).
+ A->specificity = 0x100; }
+detail(A) ::= COLON IDENT(B).
{ if (strcasecmp(B, "link") == 0) {
A = css_new_node(CSS_NODE_ATTRIB, xstrdup("href"), 0, 0);
- A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C;
+ A->specificity = 0x100;
free(B);
} else {
A = css_new_node(CSS_NODE_PSEUDO, B, 0, 0);
- A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C;
+ A->specificity = 0x100;
} }
-detail_list(A) ::= COLON FUNCTION(B) IDENT RPAREN detail_list(C).
+detail(A) ::= COLON FUNCTION(B) IDENT RPAREN.
{ A = css_new_node(CSS_NODE_PSEUDO, B, 0, 0);
- A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C; }
+ A->specificity = 0x100; }
declaration_list(A) ::= .
{ A = 0; }
@@ -138,10 +145,12 @@ declaration_list(A) ::= declaration(B).
declaration_list(A) ::= declaration_list(B) SEMI.
{ A = B; }
declaration_list(A) ::= declaration(B) SEMI declaration_list(C).
- { B->next = C; A = B; }
+ { if (B) { B->next = C; A = B; } else { A = C; } }
declaration(A) ::= property(B) COLON value(C).
{ A = css_new_node(CSS_NODE_DECLARATION, B, C, 0); }
+declaration(A) ::= any_list_1(B). /* malformed declaration: ignore */
+ { A = 0; css_free_node(B); }
property(A) ::= IDENT(B).
{ A = B; }
@@ -155,6 +164,7 @@ value(A) ::= value(B) block.
value(A) ::= value(B) ATKEYWORD.
{ A = B; }
+
any_list(A) ::= .
{ A = 0; }
any_list(A) ::= any(B) any_list(C).
@@ -219,6 +229,7 @@ any(A) ::= LBRAC any_list(B) RBRAC.
%type css_combinator { css_combinator }
%type simple_selector { struct css_node * }
%type detail_list { struct css_node * }
+%type detail { struct css_node * }
%type declaration_list { struct css_node * }
%type declaration { struct css_node * }
%type value { struct css_node * }
@@ -239,7 +250,6 @@ any(A) ::= LBRAC any_list(B) RBRAC.
%left COLON COMMA GT HASH LBRAC PLUS.
%left DOT.
-%left EMPTYIDENT.
%left IDENT.
%left LBRACE.