parser.mly 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. %{
  2. open Lexing
  3. open Types
  4. let prop2str (name, value) = name ^ ":" ^ Stringify.value2str value
  5. %}
  6. (* Tokens *)
  7. %token S CDO CDC INCLUDES DASHMATCH STRING BAD_STRING IMPORT_SYM PAGE_SYM
  8. %token MEDIA_SYM CHARSET_SYM IMPORTANT_SYM
  9. %token LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK SEMICOL COLON
  10. %token <int> EMS EXS PERCENTAGE NUMBER
  11. %token <int * string> LENGTH ANGLE TIME FREQ DIMENSION
  12. %token <string> IDENT HASH URI BAD_URI FUNCTION
  13. (* Start symbol *)
  14. %type <Types.decl list> stylesheet
  15. %start stylesheet
  16. %%
  17. (* Left-recursive list (use List.rev to obtain correctly ordered list) *)
  18. (*
  19. llist(x):
  20. | { [] }
  21. | tl=llist(x) hd=x { hd :: tl }
  22. *)
  23. stylesheet:
  24. | ( CDO | CDC | S | statement )*
  25. statement:
  26. | ruleset
  27. | at_rule
  28. at_rule:
  29. | ATKEYWORD S* any* ( block | SEMICOL S* )
  30. block:
  31. | LBRACE S* ( any | block | ATKEYWORD S* | SEMICOL S* )* RBRACE S*
  32. ruleset:
  33. | selectors=any+ LBRACE S* declaration? ( SEMICOL S* declaration? )* RBRACE S*
  34. declaration:
  35. | name=IDENT S* COLON S* value=value
  36. { Property (name, value) }
  37. value:
  38. | ( any | block | ATKEYWORD S* )+
  39. any:
  40. | ( IDENT | NUMBER | PERCENTAGE | DIMENSION | STRING | DELIM | URI | HASH |
  41. UNICODE-RANGE | INCLUDES | DASHMATCH | COLON | FUNCTION S* (any|unused)*
  42. RPAREN | LPAREN S* (any|unused)* RPAREN | LBRACK S* (any|unused)* RBRACK) S*
  43. unused:
  44. | block
  45. | ATKEYWORD S*
  46. | SEMICOL S*
  47. | CDO S*
  48. | CDC S*