From 9f135688fdeb4cc5d8ad944045bbb1a319583dc8 Mon Sep 17 00:00:00 2001
From: Taddeus Kroes <taddeuskroes@gmail.com>
Date: Fri, 18 Jul 2014 15:09:49 +0200
Subject: [PATCH] Added more CSS3 selectors

---
 lexer.mll  |  4 ++--
 parser.mly | 13 +++----------
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/lexer.mll b/lexer.mll
index cb5c126..47f8461 100644
--- a/lexer.mll
+++ b/lexer.mll
@@ -80,8 +80,8 @@ rule token = parse
 
   | "<!--"              { CDO }
   | "-->"               { CDC }
-  | ['~''|']?'=' as op  { RELATION op }
-  | ['>''~'] as c       { COMBINATOR (Char.escaped c) }
+  | ['~' '^' '$' '*' '|']? '=' as op  { RELATION op }
+  | ['>' '~'] as c      { COMBINATOR (Char.escaped c) }
 
   | mystring as s       { STRING (strip_quotes s) }
   | badstring           { raise (SyntaxError "bad string") }
diff --git a/parser.mly b/parser.mly
index 4cbafc5..0e71aa0 100644
--- a/parser.mly
+++ b/parser.mly
@@ -228,18 +228,13 @@ simple_selector:
   { elem ^ String.concat "" addons }
   | addons=element_addon+
   { String.concat "" addons }
-%inline element_addon:
-  | a=HASH | a=cls | a=attrib | a=pseudo
-  { a }
-
+%inline element_addon: a=HASH | a=cls | a=attrib | a=pseudo { a }
 element_name:
   | tag=IDENT  { tag }
   | STAR       { "*" }
-
 cls:
   | DOT name=IDENT
   { "." ^ name }
-
 attrib:
   | LBRACK S* left=IDENT S* right=pair(RELATION, rel_value)? RBRACK
   { let right = match right with None -> "" | Some (op, term) -> op ^ term in
@@ -247,13 +242,11 @@ attrib:
 %inline rel_value:
   | S* id=IDENT S*  { id }
   | S* s=STRING S*  { "\"" ^ s ^ "\"" }
-
 pseudo:
   | COLON id=IDENT
   { ":" ^ id }
-  | COLON f=FUNCTION S* arg=terminated(IDENT, S*)? RPAREN
-  { let arg = match arg with None -> "" | Some id -> id in
-    ":" ^ f ^ "(" ^ arg ^ ")" }
+  | COLON f=FUNCTION args=wslist(COMMA, simple_selector) RPAREN
+  { ":" ^ f ^ "(" ^ String.concat "," args ^ ")" }
 
 declaration:
   | name=property S* COLON S* value=expr important=boption(ig2(IMPORTANT_SYM, S*))
-- 
GitLab