From 1c3e2ecb73ab5ded9ccf2f1313652ee2d2907dd4 Mon Sep 17 00:00:00 2001
From: Taddeus Kroes <taddeuskroes@gmail.com>
Date: Fri, 18 Jul 2014 17:30:40 +0200
Subject: [PATCH] Added some support for xross-browser compatibility hacks

---
 lexer.mll  | 21 ++++++++++++---------
 parser.mly |  4 +++-
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/lexer.mll b/lexer.mll
index 47f8461..2fa2832 100644
--- a/lexer.mll
+++ b/lexer.mll
@@ -25,7 +25,7 @@ let unicode     = '\\' h(h(h(h(h(h)?)?)?)?)? wc?
 let escape      = unicode | '\\'[^'\r' '\n' '\012' '0'-'9' 'a'-'f' 'A'-'F']
 let nmstart     = ['_' 'a'-'z' 'A'-'Z'] | nonascii | escape
 let nmchar      = ['_' 'a'-'z' 'A'-'Z' '0'-'9' '-'] | nonascii | escape
-let string1     = '"'([^'\n' '\r' '\012' '"'] | '\\'nl | escape)*'"'
+let string1     = '"' ([^'\n' '\r' '\012' '"'] | '\\'nl | escape)* '"'
 let string2     = '\'' ([^'\n' '\r' '\012' '\''] | '\\' nl | escape)* '\''
 let mystring    = string1 | string2
 let badstring1  = '"' ([^'\n' '\r' '\012' '"'] | '\\'nl | escape)* '\\'?
@@ -71,6 +71,8 @@ let X = ['x' 'X']
 let Y = ['y' 'Y']
 let Z = ['z' 'Z']
 
+let uagent = ('-' ("webkit" | "moz"  | "ms" | "o") '-')?
+
 
 rule token = parse
   | s                   { S }
@@ -88,14 +90,14 @@ rule token = parse
 
   | '#' (name as nm)    { HASH nm }
 
-  | '@' I M P O R T          { IMPORT_SYM }
-  | '@' P A G E              { PAGE_SYM }
-  | '@' M E D I A            { MEDIA_SYM }
-  | "@charset "              { CHARSET_SYM }
-  | '@' F O N T '-' F A C E  { FONT_FACE_SYM }
-  | '@' N A M E S P A C E    { NAMESPACE_SYM }
-  | '@' K E Y F R A M E S    { KEYFRAMES_SYM }
-  | '@' S U P P O R T S      { SUPPORTS_SYM }
+  | '@' I M P O R T               { IMPORT_SYM }
+  | '@' P A G E                   { PAGE_SYM }
+  | '@' M E D I A                 { MEDIA_SYM }
+  | "@charset "                   { CHARSET_SYM }
+  | '@' F O N T '-' F A C E       { FONT_FACE_SYM }
+  | '@' N A M E S P A C E         { NAMESPACE_SYM }
+  | '@' uagent K E Y F R A M E S  { KEYFRAMES_SYM }
+  | '@' S U P P O R T S           { SUPPORTS_SYM }
 
   | (w | comment)* w A N D w (w | comment)* { SUPPORTS_AND }
   | (w | comment)* w O R w (w | comment)*   { SUPPORTS_OR }
@@ -141,4 +143,5 @@ rule token = parse
 
   | eof | '\000'        { EOF }
 
+  | _                   { token lexbuf }
   | _ as c { raise (SyntaxError ("unexpected '" ^ Char.escaped c ^ "'")) }
diff --git a/parser.mly b/parser.mly
index 0e71aa0..45f148a 100644
--- a/parser.mly
+++ b/parser.mly
@@ -251,7 +251,9 @@ pseudo:
 declaration:
   | name=property S* COLON S* value=expr important=boption(ig2(IMPORTANT_SYM, S*))
   { (String.lowercase name, value, important) }
-%inline property: name=IDENT  { name }
+%inline property:
+  | name=IDENT       { name }
+  | STAR name=IDENT  { "*" ^ name }  (* IE7 property name hack *)
 
 expr:
   | l=exprl             { concat_terms l }
-- 
GitLab