summaryrefslogtreecommitdiff
path: root/css
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2003-04-01 20:18:18 +0000
committerJames Bursa <james@netsurf-browser.org>2003-04-01 20:18:18 +0000
commitc520b304128c7dda02872a60355a82dfceb7750f (patch)
treedba735a5be6b64218d2935a0d33440e2e50258b6 /css
parent5d371fb47e0b1b1e43574cf674893b890067b9b6 (diff)
downloadnetsurf-c520b304128c7dda02872a60355a82dfceb7750f.tar.gz
netsurf-c520b304128c7dda02872a60355a82dfceb7750f.tar.bz2
[project @ 2003-04-01 20:18:18 by bursa]
CSS parser progress. svn path=/import/netsurf/; revision=110
Diffstat (limited to 'css')
-rw-r--r--css/parser.y106
1 files changed, 51 insertions, 55 deletions
diff --git a/css/parser.y b/css/parser.y
index 5dfe1bd01..7d5e98a60 100644
--- a/css/parser.y
+++ b/css/parser.y
@@ -1,15 +1,15 @@
/**
- * $Id: parser.y,v 1.1 2003/03/25 21:03:14 bursa Exp $
+ * $Id: parser.y,v 1.2 2003/04/01 20:18:18 bursa Exp $
*/
-/*
+/*
CSS parser using the lemon parser generator
see CSS2 Specification, chapter 4
http://www.w3.org/TR/REC-CSS2/syndata.html,
and errata
-http://www.w3.org/Style/css2-updates/REC-CSS2-19980512-errata
+http://www.w3.org/Style/css2-updates/REC-CSS2-19980512-errata
stylesheet : [ CDO | CDC | S | statement ]*;
statement : ruleset | at-rule;
@@ -27,23 +27,16 @@ any : [ IDENT | NUMBER | PERCENTAGE | DIMENSION | STRING
Note: S, CDO, CDC will be stripped out by the scanner
*/
-stylesheet ::= statement_list(A).
- { *stylesheet = A; }
+stylesheet ::= statement_list.
-statement_list(A) ::= .
- { A = 0; }
-statement_list(A) ::= statement(B) statement_list(C).
- { if (B == 0) { A = C; } else { B->next = C; A = B; } }
+statement_list ::= .
+statement_list ::= statement_list statement.
-statement(A) ::= ruleset(B).
- { A = B; }
-statement(A) ::= at_rule(B).
- { A = B; }
+statement ::= ruleset.
+statement ::= at_rule.
-at_rule(A) ::= ATKEYWORD any_list block.
- { A = css_new_node(CSS_NODE_AT_RULE, 0, 0, 0); }
-at_rule(A) ::= ATKEYWORD any_list SEMI.
- { A = css_new_node(CSS_NODE_AT_RULE, 0, 0, 0); }
+at_rule ::= ATKEYWORD any_list block.
+at_rule ::= ATKEYWORD any_list SEMI.
block ::= LBRACE block_body RBRACE.
block_body ::= .
@@ -52,10 +45,11 @@ block_body ::= block_body block.
block_body ::= block_body ATKEYWORD.
block_body ::= block_body SEMI.
-ruleset(A) ::= selector(B) LBRACE declaration_list(C) RBRACE.
- { A = css_new_node(CSS_NODE_RULESET, 0, B, C); }
-ruleset(A) ::= LBRACE declaration_list RBRACE.
- { A = 0; } /* this form of ruleset not used in CSS2 */
+ruleset ::= selector(A) LBRACE declaration_list(B) RBRACE.
+ { css_add_ruleset(stylesheet, A, B);
+ css_free_node(A); css_free_node(B); }
+ruleset ::= LBRACE declaration_list RBRACE.
+ /* this form of ruleset not used in CSS2 */
selector(A) ::= any_list_1(B).
{ A = B; }
@@ -70,7 +64,7 @@ declaration_list(A) ::= declaration(B) SEMI declaration_list(C).
{ B->next = C; A = B; }
declaration(A) ::= property(B) COLON value(C).
- { A = css_new_node(CSS_NODE_DECLARATION, B, C, 0); }
+ { A = css_new_node(NODE_DECLARATION, B, C, 0); }
property(A) ::= IDENT(B).
{ A = B; }
@@ -91,65 +85,67 @@ any_list(A) ::= any(B) any_list(C).
any_list_1(A) ::= any(B) any_list(C).
{ B->next = C; A = B; }
any(A) ::= IDENT(B).
- { A = css_new_node(CSS_NODE_IDENT, B, 0, 0); }
+ { A = css_new_node(NODE_IDENT, B, 0, 0); }
any(A) ::= NUMBER(B).
- { A = css_new_node(CSS_NODE_NUMBER, B, 0, 0); }
+ { A = css_new_node(NODE_NUMBER, B, 0, 0); }
any(A) ::= PERCENTAGE(B).
- { A = css_new_node(CSS_NODE_PERCENTAGE, B, 0, 0); }
+ { A = css_new_node(NODE_PERCENTAGE, B, 0, 0); }
any(A) ::= DIMENSION(B).
- { A = css_new_node(CSS_NODE_DIMENSION, B, 0, 0); }
+ { A = css_new_node(NODE_DIMENSION, B, 0, 0); }
any(A) ::= STRING(B).
- { A = css_new_node(CSS_NODE_STRING, B, 0, 0); }
+ { A = css_new_node(NODE_STRING, B, 0, 0); }
any(A) ::= DELIM(B).
- { A = css_new_node(CSS_NODE_DELIM, B, 0, 0); }
+ { A = css_new_node(NODE_DELIM, B, 0, 0); }
any(A) ::= URI(B).
- { A = css_new_node(CSS_NODE_URI, B, 0, 0); }
+ { A = css_new_node(NODE_URI, B, 0, 0); }
any(A) ::= HASH(B).
- { A = css_new_node(CSS_NODE_HASH, B, 0, 0); }
+ { A = css_new_node(NODE_HASH, B, 0, 0); }
any(A) ::= UNICODE_RANGE(B).
- { A = css_new_node(CSS_NODE_UNICODE_RANGE, B, 0, 0); }
+ { A = css_new_node(NODE_UNICODE_RANGE, B, 0, 0); }
any(A) ::= INCLUDES(B).
- { A = css_new_node(CSS_NODE_INCLUDES, B, 0, 0); }
+ { A = css_new_node(NODE_INCLUDES, B, 0, 0); }
any(A) ::= FUNCTION(B).
- { A = css_new_node(CSS_NODE_FUNCTION, B, 0, 0); }
+ { A = css_new_node(NODE_FUNCTION, B, 0, 0); }
any(A) ::= DASHMATCH(B).
- { A = css_new_node(CSS_NODE_DASHMATCH, B, 0, 0); }
+ { A = css_new_node(NODE_DASHMATCH, B, 0, 0); }
any(A) ::= COLON(B).
- { A = css_new_node(CSS_NODE_COLON, B, 0, 0); }
+ { A = css_new_node(NODE_COLON, B, 0, 0); }
any(A) ::= LPAREN any_list(B) RPAREN.
- { A = css_new_node(CSS_NODE_PAREN, 0, B, 0); }
+ { A = css_new_node(NODE_PAREN, 0, B, 0); }
any(A) ::= LBRAC any_list(B) RBRAC.
- { A = css_new_node(CSS_NODE_BRAC, 0, B, 0); }
+ { A = css_new_node(NODE_BRAC, 0, B, 0); }
/* lemon directives */
-%extra_argument { struct css_node **stylesheet }
-%include { #include "netsurf/css/css.h"
+%extra_argument { struct css_stylesheet *stylesheet }
+%include {
+#define CSS_INTERNALS
+#include "netsurf/css/css.h"
#include "netsurf/utils/utils.h" }
%name css_parser_
%token_type { char* }
%token_destructor { xfree($$); }
-%type stylesheet { struct css_node * }
-%type statement_list { struct css_node * }
-%type statement { struct css_node * }
-%type at_rule { struct css_node * }
-%type ruleset { struct css_node * }
-%type selector { struct css_node * }
-%type declaration_list { struct css_node * }
-%type declaration { struct css_node * }
-%type value { struct css_node * }
-%type any_list { struct css_node * }
-%type any_list_1 { struct css_node * }
-%type any { struct css_node * }
-
-%destructor stylesheet { css_free_node($$); }
+/*%type stylesheet { struct node * }
+%type statement_list { struct node * }
+%type statement { struct node * }
+%type at_rule { struct node * }
+%type ruleset { struct node * }*/
+%type selector { struct node * }
+%type declaration_list { struct node * }
+%type declaration { struct node * }
+%type value { struct node * }
+%type any_list { struct node * }
+%type any_list_1 { struct node * }
+%type any { struct node * }
+
+/*%destructor stylesheet { css_free_node($$); }
%destructor statement_list { css_free_node($$); }
%destructor statement { css_free_node($$); }
%destructor at_rule { css_free_node($$); }
-%destructor ruleset { css_free_node($$); }
+%destructor ruleset { css_free_node($$); }*/
%destructor selector { css_free_node($$); }
%destructor declaration_list { css_free_node($$); }
%destructor declaration { css_free_node($$); }
@@ -158,5 +154,5 @@ any(A) ::= LBRAC any_list(B) RBRAC.
%destructor any_list_1 { css_free_node($$); }
%destructor any { css_free_node($$); }
-%parse_failure { *stylesheet = 0; }
+/*%parse_failure { *stylesheet = 0; }*/