Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

add skeleton for lang_css/parsing/

  • Loading branch information...
commit c7092a9d6e394df614ae0560416f25cc46530db6 1 parent 967467a
@aryx aryx authored
View
4 .gitignore
@@ -313,3 +313,7 @@ external/ocamlbdb/libcamlbdb.a
/lang_html/parsing/parser_html.ml
/lang_html/parsing/parser_html.mli
/lang_html/parsing/parser_html.output
+/lang_css/parsing/lexer_css.ml
+/lang_css/parsing/parser_css.ml
+/lang_css/parsing/parser_css.mli
+/lang_css/parsing/parser_css.output
View
7 Makefile
@@ -155,14 +155,15 @@ BASICLIBS=commons/commons.cma \
lang_ml/parsing/lib.cma \
lang_nw/parsing/lib.cma \
lang_php/parsing/lib.cma \
- lang_js/parsing/lib.cma \
- lang_cpp/parsing/lib.cma \
lang_php/matcher/lib.cma \
+ lang_cpp/parsing/lib.cma \
lang_java/parsing/lib.cma \
lang_python/parsing/lib.cma \
lang_csharp/parsing/lib.cma \
lang_erlang/parsing/lib.cma \
lang_html/parsing/lib.cma \
+ lang_js/parsing/lib.cma \
+ lang_css/parsing/lib.cma \
lang_text/lib.cma \
BASICSYSLIBS=nums.cma bigarray.cma str.cma unix.cma
@@ -219,6 +220,7 @@ LIBS= commons/commons.cma \
lang_text/lib.cma \
lang_html/parsing/lib.cma \
lang_html/analyze/lib.cma \
+ lang_css/parsing/lib.cma \
MAKESUBDIRS=commons \
@@ -268,6 +270,7 @@ MAKESUBDIRS=commons \
lang_php/analyze/static_analysis \
lang_html/parsing \
lang_html/analyze \
+ lang_css/parsing \
lang_text \
$(VISUALDIR) \
$(FACEBOOKDIR)
View
12 docs/ocaml/developer.txt
@@ -1,9 +1,12 @@
+-*- org -*-
+
have C-c C-t working to get type information under cursor
+** style:
+
+*** bad example of style: ocamlnet/netstring/nethtml.ml.
-style:
- bad example of style: ocamlnet/netstring/nethtml.ml.
bad nested functions,
bad indentation, too many newlines
bad use of open variants
@@ -36,3 +39,8 @@ let model_of ~dtd_hash element_name =
| m -> m
)
with Not_found -> (Everywhere, Any)
+
+*** bad example of style: ccss/
+bad use of open variants instead of plan variants
+use of _t to suffix type definition (no need, different namespace)
+
View
5 lang_css/ast_css.ml
@@ -1,5 +0,0 @@
-
-(* alternatives:
- * - css parser and preprocessor: http://forge.ocamlcore.org/projects/ccss/
- * - camlp4 and css https://github.com/samoht/cass
- *)
View
81 lang_css/parsing/Makefile
@@ -0,0 +1,81 @@
+TOP=../..
+##############################################################################
+# Variables
+##############################################################################
+TARGET=lib
+
+-include $(TOP)/Makefile.config
+
+SRC= flag_parsing_css.ml \
+ ast_css.ml \
+ lib_parsing_css.ml \
+ test_parsing_css.ml
+
+# visitor_html.ml \
+# export_html.ml \
+# parser_html.ml lexer_html.ml \
+# token_helpers_html.ml \
+# dtd_simple.ml \
+# parse_html.ml \
+# unparse_html.ml \
+#
+
+SYSLIBS= str.cma unix.cma
+LIBS=$(TOP)/commons/commons.cma
+
+INCLUDEDIRS= $(TOP)/commons $(TOP)/commons/ocamlextra \
+ $(TOP)/commons/lib-sexp $(TOP)/commons/lib-json \
+ $(TOP)/globals \
+ $(TOP)/h_program-lang \
+
+
+##############################################################################
+# Generic variables
+##############################################################################
+
+-include $(TOP)/Makefile.common
+
+##############################################################################
+# Top rules
+##############################################################################
+all:: $(TARGET).cma
+all.opt:: $(TARGET).cmxa
+
+$(TARGET).cma: $(OBJS)
+ $(OCAMLC) -a -o $(TARGET).cma $(OBJS)
+
+$(TARGET).cmxa: $(OPTOBJS) $(LIBS:.cma=.cmxa)
+ $(OCAMLOPT) -a -o $(TARGET).cmxa $(OPTOBJS)
+
+$(TARGET).top: $(OBJS) $(LIBS)
+ $(OCAMLMKTOP) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
+
+clean::
+ rm -f $(TARGET).top
+
+
+lexer_css.ml: lexer_css.mll
+ $(OCAMLLEX) $<
+clean::
+ rm -f lexer_css.ml
+beforedepend:: lexer_css.ml
+
+
+parser_css.ml parser_css.mli: parser_css.mly
+ $(OCAMLYACC) $<
+clean::
+ rm -f parser_css.ml parser_css.mli parser_css.output
+beforedepend:: parser_css.ml parser_css.mli
+
+
+visitor_css.cmo: visitor_css.ml
+ $(OCAMLC) -w y -c $<
+
+
+##############################################################################
+# Generic rules
+##############################################################################
+
+##############################################################################
+# Literate Programming rules
+##############################################################################
View
17 lang_css/parsing/ast_css.ml
@@ -0,0 +1,17 @@
+
+open Common
+
+(*****************************************************************************)
+(* Prelude *)
+(*****************************************************************************)
+
+(*
+ * This file contains the type definitions for a Cascading Style Sheet
+ * file, aka CSS file.
+ *
+ * See also http://en.wikipedia.org/wiki/Cascading_Style_Sheets
+ *
+ * alternatives:
+ * - css parser and preprocessor: http://forge.ocamlcore.org/projects/ccss/
+ * - camlp4 and css https://github.com/samoht/cass
+ *)
View
18 lang_css/parsing/changes.txt
@@ -0,0 +1,18 @@
+-------------------------
+(2010-03-24) version 1.2:
+
+ * Handling of !important declarations;
+ * More leniency in characters allowed in identifiers;
+ * Allow division of quantities with the same unit (result is scalar);
+ * Always allow addition/subtraction when one of the operands is the scalar 0;
+
+-------------------------
+(2010-03-12) version 1.1:
+
+ * Added support for unit conversion.
+
+-------------------------
+(2010-03-10) version 1.0:
+
+ * First public release.
+
View
2  lang_css/parsing/copyright.txt
@@ -0,0 +1,2 @@
+| Dario Teixeira (dario.teixeira@yahoo.com) |
+| March 2010 |
View
0  lang_css/parsing/flag_parsing_css.ml
No changes.
View
22 lang_css/parsing/lexer_css.mll
@@ -0,0 +1,22 @@
+{
+(*
+ *
+ * Copyright (C) 2011 Facebook
+ *
+ *)
+
+open Common
+
+(*****************************************************************************)
+(* Prelude *)
+(*****************************************************************************)
+
+}
+
+(*****************************************************************************)
+
+let letter = ['A'-'Z' 'a'-'z' ]
+
+rule scan = parse
+ | "<!--" { raise Todo }
+
View
53 lang_css/parsing/lib_parsing_css.ml
@@ -0,0 +1,53 @@
+(* Yoann Padioleau
+ *
+ * Copyright (C) 2011 Facebook
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation, with the
+ * special exception on linking described in file license.txt.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the file
+ * license.txt for more details.
+ *)
+
+open Common
+
+open Ast_css
+
+module Ast = Ast_css
+module Flag = Flag_parsing_css
+
+(* module V = Visitor_erlang *)
+
+(*****************************************************************************)
+(* Wrappers *)
+(*****************************************************************************)
+
+(*****************************************************************************)
+(* Filemames *)
+(*****************************************************************************)
+
+let find_css_files_of_dir_or_files xs =
+ Common.files_of_dir_or_files_no_vcs_nofilter xs
+ +> List.filter (fun filename ->
+ let ftype = File_type.file_type_of_file filename in
+ match ftype with
+ | File_type.PL (File_type.Web (File_type.Css)) -> true
+ | _ -> false
+ ) |> Common.sort
+
+(*****************************************************************************)
+(* Extract infos *)
+(*****************************************************************************)
+
+(*****************************************************************************)
+(* Max min, range *)
+(*****************************************************************************)
+
+(*****************************************************************************)
+(* AST helpers *)
+(*****************************************************************************)
+
View
3  lang_css/parsing/lib_parsing_css.mli
@@ -0,0 +1,3 @@
+
+val find_css_files_of_dir_or_files:
+ Common.path list -> Common.filename list
View
339 lang_css/parsing/license.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
View
4 lang_css/parsing/modif-orig.txt
@@ -0,0 +1,4 @@
+Many of the code in this directory comes from ccss by dario teixera.
+I've removed the need for ulex and menhir and use ocamllex ocamlyacc instead.
+
+
View
222 lang_css/parsing/parser_css.mly
@@ -0,0 +1,222 @@
+/********************************************************************************/
+/* Parser.mly
+ Copyright (c) 2010 Dario Teixeira (dario.teixeira@yahoo.com)
+ This software is distributed under the terms of the GNU GPL version 2.
+ See LICENSE file for full license text.
+*/
+/********************************************************************************/
+
+%{
+let nelist = function
+ | hd :: tl -> (hd, tl)
+ | [] -> failwith "nelist"
+%}
+
+
+/********************************************************************************/
+/* Token declarations. */
+/********************************************************************************/
+
+%token EOF
+%token S
+
+%token CHARSET IMPORT MEDIA PAGE FONTFACE
+
+%token OPEN_CURLY CLOSE_CURLY
+%token OPEN_ROUND CLOSE_ROUND
+%token OPEN_SQUARE CLOSE_SQUARE
+%token SEMICOLON COLON DOUBLE_COLON COMMA PERIOD SLASH
+%token ASTERISK QUOTIENT PLUS MINUS
+%token TILDE GT IMPORTANT
+
+%token ATTR_EQUALS
+%token ATTR_INCLUDES
+%token ATTR_DASHMATCH
+%token ATTR_PREFIX
+%token ATTR_SUFFIX
+%token ATTR_SUBSTRING
+
+%token URI
+%token <string> STRING
+%token <string> IDENT
+%token <string> NTH
+%token <string> HASH
+%token <string> VAR
+
+%token <string> SEL_FUNC
+%token <string> TERM_FUNC
+
+%token <Ast.quantity_t> QUANTITY
+
+
+/********************************************************************************/
+/* Associativity and precedence declarations. */
+/********************************************************************************/
+
+%left PLUS MINUS
+%left ASTERISK QUOTIENT
+
+
+/********************************************************************************/
+/* Top-level statements. */
+/********************************************************************************/
+
+%type <Ast.t> stylesheet
+
+%start stylesheet
+
+%%
+
+stylesheet:
+ | s_star charset_opt statement_star EOF {($2, $3)}
+
+charset:
+ | CHARSET STRING SEMICOLON {$2}
+
+statement:
+ | IMPORT source s_opt media_list_opt SEMICOLON
+ {`Import ($2, $4)}
+ | MEDIA media_list OPEN_CURLY rule_plus CLOSE_CURLY
+ {`Media ($2, $4)}
+ | PAGE pseudo_page_opt declaration_block
+ {`Page ($2, $3)}
+ | FONTFACE declaration_block
+ {`Fontface $2}
+ | VAR COLON expr SEMICOLON
+ { raise Todo (* `Vardecl ($startpos($1), $1, $3) *)}
+ | rule
+ {`Rule $1}
+
+source:
+ | STRING
+ {`String $1}
+ | URI STRING CLOSE_ROUND
+ {`Uri $2}
+
+media_list:
+ | medium_separated_nonempty_list_COMMA {$1}
+
+medium:
+ | IDENT {$1}
+
+pseudo_page:
+ | COLON IDENT {$2}
+
+rule:
+ | selector_list declaration_block {($1, $2)}
+
+
+/********************************************************************************/
+/* Selectors. */
+/********************************************************************************/
+
+selector_list:
+ | selector_separated_nonempty_list_COMMA {$1}
+
+selector:
+ | simple_selector combination_star {($1, $2)}
+
+combination:
+ | combinator simple_selector {($1, $2)}
+
+combinator:
+ | S {`Descendant}
+ | TILDE {`General_sibling}
+ | PLUS {`Adjacent_sibling}
+ | GT {`Child}
+
+simple_selector:
+ | element qualifier_star {`Explicit ($1, $2)}
+ | qualifier_plus {`Generic (nelist $1)}
+
+element:
+ | IDENT {`Tag $1}
+ | ASTERISK {`Universal}
+
+qualifier:
+ | HASH {`Id $1}
+ | PERIOD IDENT {`Class $2}
+ | OPEN_SQUARE IDENT attr_operation CLOSE_SQUARE {`Attr ($2, $3)}
+ | COLON IDENT {`Pseudo_class $2}
+ | DOUBLE_COLON IDENT {`Pseudo_element $2}
+ | SEL_FUNC function_args CLOSE_ROUND {`Sel_func ($1, $2)}
+
+function_args:
+ | qualifier_plus {`Qualified $1}
+ | NTH {`Nth $1}
+ | IDENT {`Nth $1}
+
+attr_operation:
+ | /* empty */ {`Attr_exists}
+ | ATTR_EQUALS attr_operand {`Attr_equals $2}
+ | ATTR_INCLUDES attr_operand {`Attr_includes $2}
+ | ATTR_DASHMATCH attr_operand {`Attr_dashmatch $2}
+ | ATTR_PREFIX attr_operand {`Attr_prefix $2}
+ | ATTR_SUFFIX attr_operand {`Attr_suffix $2}
+ | ATTR_SUBSTRING attr_operand {`Attr_substring $2}
+
+attr_operand:
+ | IDENT {$1}
+ | STRING {$1}
+
+
+/********************************************************************************/
+/* Declarations. */
+/********************************************************************************/
+
+declaration_block:
+ | OPEN_CURLY declaration_plus CLOSE_CURLY {$2}
+
+declaration:
+ | IDENT COLON expr boption_IMPORTANT SEMICOLON {($1, $3, $4)}
+
+expr:
+ | sentence_separated_nonempty_list_COMMA {$1}
+
+sentence:
+ | term_separated_nonempty_list_sopt {$1}
+
+term:
+ | calc {`Calc $1}
+ | STRING {`String $1}
+ | IDENT {`Ident $1}
+ | URI STRING CLOSE_ROUND {`Uri $2}
+ | HASH {`Hash $1}
+ | TERM_FUNC expr CLOSE_ROUND {`Term_func ($1, $2)}
+ | SLASH {`Slash}
+
+calc:
+ | VAR
+ {raise Todo (* `Varref ($startpos($1), $1) *)}
+ | QUANTITY {`Quantity $1}
+
+/*
+
+ | calc ASTERISK calc {`Mul ($startpos($2), $1, $3)}
+ | calc QUOTIENT calc {`Div ($startpos($2), $1, $3)}
+ | calc PLUS calc {`Sum ($startpos($2), $1, $3)}
+ | calc MINUS calc {`Sub ($startpos($2), $1, $3)}
+ | OPEN_ROUND calc CLOSE_ROUND {$2}
+*/
+
+
+s_star: S { }
+charset_opt: S { }
+statement_star: S { }
+s_opt: S { }
+media_list_opt: S { }
+rule_plus: S { }
+pseudo_page_opt: S { }
+
+medium_separated_nonempty_list_COMMA: S { }
+selector_separated_nonempty_list_COMMA: S { }
+combination_star: S { }
+qualifier_star: S { }
+qualifier_plus: S { }
+declaration_plus: S { }
+boption_IMPORTANT: S { }
+sentence_separated_nonempty_list_COMMA: S { }
+term_separated_nonempty_list_sopt: S { }
+
+
+
View
134 lang_css/parsing/readme.txt
@@ -0,0 +1,134 @@
+=========================================================================
+| README for CCSS 1.2 |
+| |
+| Dario Teixeira (dario.teixeira@yahoo.com) |
+| March 2010 |
+=========================================================================
+
+1. Overview
+===========
+
+CCSS is a preprocessor/pretty-printer for CSS (Cascading Style Sheets).
+It extends the CSS language with support for declaration of variables and
+basic arithmetic operations (addition, subtraction, multiplication, division).
+The programme is supposed to be used as a filter: it reads the CSS source
+from stdin and outputs its result on stdout.
+
+
+2. Features
+===========
+
+2.1. Variables
+==============
+
+With CCSS, you may declare and use variables in your CSS code (in fact, CCSS
+variables are actually constants, since they are assigned upon declaration and
+may not be changed). Variable identifiers must begin with an uppercase letter,
+and be followed by any combination of letters, numbers, and the characters
+'-' (dash) and '_' (underscore). The value assigned to a variable may be
+any CSS expression -- not only quantities -- as the code below demonstrates:
+
+Foo: 20em;
+Bar: 1px solid black;
+
+h1 {
+ width: Foo;
+ border: Bar;
+ }
+
+
+2.2. Arithmetic
+===============
+
+CCSS extends CSS expressions with basic arithmetic operations (addition,
+subtraction, multiplication, and division). The operands must be CSS
+quantities (either dimensionless or with an attached unit), or other
+expressions that ultimately resolve into a quantity. Moreover, variables
+whose value is a quantity (or an expression which resolves into a quantity)
+may also be used as operand.
+
+The operators are '+', '-', '*', and '÷'. Note that multiplication and
+division have precedence over addition and subtraction, but you may use
+parentheses to group operations. Consider thus the following input:
+
+Left: 10em;
+Right: 5em;
+Total: Left + Right;
+
+h1 {
+ padding: (1.5em + 0.5em) * 2;
+ width: 2 * Total;
+ }
+
+
+CCSS will produce the following output:
+
+h1
+ {
+ padding: 4em;
+ width: 30em;
+ }
+
+
+The reader will have noticed that CCSS must be unit-aware when performing
+arithmetic. As a matter of fact, the programme performs a basic sanity
+check of units, and will complain if you try, for example, to add "1em" with
+"10px". By default, CCSS will not make any attempt to convert units even if
+they are convertible, such "cm" and "mm". If you wish for CCSS to attempt
+unit conversion, please provide option "--convert" on the command line
+(short version "-c").
+
+
+Units can be grouped into four categories, and conversion is possible if the
+units belong to the same category. Upon conversion, the result will be the
+same unit as the first operand. The categories and corresponding units are
+as follows:
+
+ length: mm, cm, in, pt, pc
+ angle: deg, grad, rad
+ time: ms, s
+frequency: hz, khz
+
+
+As an illustration of unit conversion, the result for all the following
+arithmetic operations is the same, "2in":
+
+h1
+ {
+ foo1: 1in + 1in;
+ foo2: 1in + 2.54cm;
+ foo3: 1in + 25.4mm;
+ foo4: 1in + 72pt;
+ foo5: 1in + 6pc;
+ }
+
+
+3. Dependencies
+===============
+
+Menhir is used as the parser generator [1], while scanning is done with Ulex [2].
+Other requirements are ExtLib [3] and Pcre-ocaml [4].
+
+
+4. Building and installing
+==========================
+
+The build system relies on Ocamlbuild. Enter 'make' in the 'src' directory
+for building the bytecode and native binaries.
+
+
+5. License
+==========
+
+CCSS is distributed under the terms of the GNU GPL version 2.
+See LICENSE file for full license text.
+
+
+References
+==========
+
+[1] http://cristal.inria.fr/~fpottier/menhir/
+[2] http://www.cduce.org/download.html
+[3] http://code.google.com/p/ocaml-extlib/
+[4] http://www.ocaml.info/home/ocaml_sources.html#pcre-ocaml
+
View
52 lang_css/parsing/test_parsing_css.ml
@@ -0,0 +1,52 @@
+open Common
+
+open Ast_css
+module Ast = Ast_css
+module Flag = Flag_parsing_css
+
+open OUnit
+
+(*****************************************************************************)
+(* Subsystem testing *)
+(*****************************************************************************)
+
+let test_tokens_css file =
+ if not (file =~ ".*\\.css")
+ then pr2 "warning: seems not a css file";
+
+(*
+ Flag.verbose_lexing := true;
+ Flag.verbose_parsing := true;
+ let (_ast, toks) = Parse_html.parse file in
+ toks +> List.iter (fun x -> pr2_gen x);
+*)
+ ()
+
+let test_parse_css xs =
+
+ let fullxs = Lib_parsing_css.find_css_files_of_dir_or_files xs in
+ fullxs +> List.iter (fun file ->
+ pr2 ("PARSING: " ^ file);
+ ()
+ );
+ ()
+
+let test_dump_css file =
+ raise Todo
+
+(*****************************************************************************)
+(* Unit tests *)
+(*****************************************************************************)
+
+(*****************************************************************************)
+(* Main entry for Arg *)
+(*****************************************************************************)
+
+let actions () = [
+ "-tokens_css", " <file>",
+ Common.mk_action_1_arg test_tokens_css;
+ "-parse_css", " <files or dirs>",
+ Common.mk_action_n_arg test_parse_css;
+ "-dump_css", " <file>",
+ Common.mk_action_1_arg test_dump_css;
+]
View
6 lang_css/parsing/test_parsing_css.mli
@@ -0,0 +1,6 @@
+
+(* This makes accessible the different test_xxx functions above from
+ * the command line, e.g. '$ pfff -parse_css foo.css will call the
+ * test_parse_css function.
+ *)
+val actions : unit -> Common.cmdline_actions
View
1  main.ml
@@ -83,6 +83,7 @@ let all_actions () =
Test_mini_php.actions()++
Test_parsing_text.actions()++
Test_parsing_html.actions()++
+ Test_parsing_css.actions()++
Test_analyze_cpp.actions () ++
[]
View
74 tests/css/sites/default_ccss.css
@@ -0,0 +1,74 @@
+body
+ {
+ margin: auto;
+ padding: 1em 0 2em;
+ width: 50em;
+ font-family: "Arial", sans-serif;
+ font-size: 100%;
+ color: #333;
+ }
+
+#header h1
+ {
+ margin: 1em auto;
+ line-height: 77px;
+ padding-left: 240px;
+ border: none;
+ font-size: 150%;
+ color: #800000;
+ background: transparent url('logo.png') no-repeat;
+ }
+
+#header h1 span
+ {
+ vertical-align: middle;
+ }
+
+h1
+ {
+ margin: 2em 0 1em;
+ padding-bottom: 0.25em;
+ font-size: 140%;
+ border-bottom: 1px dotted #000;
+ }
+
+h2 {
+ font-size: 120%;
+ }
+
+
+li
+ {
+ margin-bottom: 0.25em;
+ }
+
+code
+ {
+ font-weight: bold;
+ font-color: #999;
+ }
+
+dl
+ {
+ margin-left: 1em;
+ }
+
+dt
+ {
+ display: list-item;
+ list-style: disc outside;
+ text-decoration: underline;
+ }
+
+dd
+ {
+ margin: 0.5em 2em 1em;
+ }
+
+pre
+ {
+ background: #ffe;
+ border: 1px dotted #666;
+ padding: 1em;
+ }
+
View
215 tests/html/sites/index_ccss.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head profile="http://www.w3.org/2005/11/profile">
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <title>CCSS</title>
+ <link rel="stylesheet" type="text/css" href="default.css" title="Default CSS" media="all"/>
+</head>
+
+<body>
+
+<div id="root">
+
+ <div id="header">
+ <h1><span>CCSS: CSS + Variables + Arithmetic</span></h1>
+ </div>
+
+ <div id="canvas">
+
+ <h1>About CCSS</h1>
+
+ <p>
+ CCSS is a preprocessor/pretty-printer for CSS (Cascading Style Sheets).
+ It extends the CSS language with support for declaration of variables and
+ basic arithmetic operations (addition, subtraction, multiplication, division).
+ The programme is supposed to be used as a filter: it reads the CSS source
+ from stdin and outputs its result on stdout.
+ </p>
+
+ <p>
+ While it does not claim to support all the dark corners of CSS,
+ in practice CCSS handles most CSS found in the wild, including CSS3
+ constructs. Its primary advantage over similar preprocessors is speed:
+ the project is implemented in <a href="http://caml.inria.fr/">Ocaml</a>,
+ a language renowned for producing native-code executables of blazing
+ performance.
+ </p>
+
+ <p>
+ CCSS is developed by <a href="mailto:let (a,b,c,d) = (dario, teixeira, yahoo, com) in a.b@c.d">Dario Teixeira</a>
+ and is licensed under the terms of the <a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU GPL 2.0</a>.
+ </p>
+
+ <h1>Features</h1>
+
+ <dl>
+
+ <dt>Variables:</dt>
+
+ <dd>
+
+ <p>
+ With CCSS, you may declare and use variables in your CSS code (in fact,
+ CCSS variables are actually constants, since they are assigned upon
+ declaration and may not be changed). Variable identifiers must begin
+ with an uppercase letter, and be followed by any combination of letters,
+ numbers, and the characters '<code>-</code>' (dash) and '<code>_</code>'
+ (underscore). The value assigned to a variable may be any CSS expression
+ &mdash; not only quantities &mdash; as the code below demonstrates:
+ </p>
+
+<pre>
+Foo: 20em;
+Bar: 1px solid black;
+
+h1 {
+ width: Foo;
+ border: Bar;
+ }
+</pre>
+ </dd>
+
+ <dt>Arithmetic:</dt>
+
+ <dd>
+ <p>
+ CCSS extends CSS expressions with basic arithmetic operations (addition,
+ subtraction, multiplication, and division). The operands must be CSS
+ quantities (either dimensionless or with an attached unit), or other
+ expressions that ultimately resolve into a quantity. Moreover, variables
+ whose value is a quantity (or an expression which resolves into a quantity)
+ may also be used as operand.
+ </p>
+
+ <p>
+ The operators are '<code>+</code>', '<code>-</code>', '<code>*</code>',
+ and '<code>÷</code>'. Note that multiplication and division have
+ precedence over addition and subtraction, but you may use parentheses
+ to group operations. Consider thus the following input:
+ </p>
+
+<pre>
+Left: 10em;
+Right: 5em;
+Total: Left + Right;
+
+h1 {
+ padding: (1.5em + 0.5em) * 2;
+ width: 2 * Total;
+ }
+</pre>
+
+ <p>
+ CCSS will produce the following output:
+ </p>
+<pre>
+h1
+ {
+ padding: 4em;
+ width: 30em;
+ }
+</pre>
+
+ <p>
+ The reader will have noticed that CCSS must be unit-aware when performing
+ arithmetic. As a matter of fact, the programme performs a basic sanity
+ check of units, and will complain if you try, for example, to add
+ '<code>1em</code>' with '<code>10px</code>'. By default, CCSS will
+ not make any attempt to convert units even if they are convertible,
+ such '<code>cm</code>' and '<code>mm</code>'. If you wish for CCSS to
+ attempt unit conversion, please provide option '<code>--convert</code>'
+ on the command line (short version '<code>-c</code>').
+ </p>
+
+ <p>
+ Units can be grouped into four categories, and conversion is possible if
+ the units belong to the same category. Upon conversion, the result will
+ be the same unit as the first operand. The categories and corresponding
+ units are as follows:
+ </p>
+
+ <dl>
+ <dt>length:</dt><dd>mm, cm, in, pt, pc</dd>
+ <dt>angle:</dt><dd>deg, grad, rad</dd>
+ <dt>time:</dt><dd>ms, s</dd>
+ <dt>frequency:</dt><dd>hz, khz</dd>
+ </dl>
+
+ <p>
+ As an illustration of unit conversion, the result for all the following
+ arithmetic operations is the same, '<code>2in</code>':
+ </p>
+
+<pre>
+h1
+ {
+ foo1: 1in + 1in;
+ foo2: 1in + 2.54cm;
+ foo3: 1in + 25.4mm;
+ foo4: 1in + 72pt;
+ foo5: 1in + 6pc;
+ }
+</pre>
+
+ </dd>
+
+ <h1>Dependencies</h1>
+
+ <p>
+ <a href="http://cristal.inria.fr/~fpottier/menhir/">Menhir</a>
+ is used as the parser generator, while scanning is done with
+ <a href="http://www.cduce.org/download.html">Ulex</a>. Other
+ requirements are <a href="http://code.google.com/p/ocaml-extlib/">ExtLib</a> and
+ <a href="http://www.ocaml.info/home/ocaml_sources.html#pcre-ocaml">Pcre-ocaml</a>.
+ </p>
+
+ <h1>Downloads</h1>
+
+ <p>
+ CCSS is distributed in source-code form. You can get all releases from
+ the <a href="http://forge.ocamlcore.org/projects/ccss">project's page</a>
+ at the <a href="http://forge.ocamlcore.org/">Ocaml Forge</a>. The latest release
+ is <a href="http://forge.ocamlcore.org/frs/download.php/374/ccss-1.2.tgz">CCSS 1.2</a>.
+ </p>
+
+ <h1>Building and installing</h1>
+
+ <p>
+ The build system relies on Ocamlbuild. Enter '<code>make</code>' in the
+ '<code>src</code>' directory for building the bytecode and native binaries.
+ </p>
+
+ <h1>Links</h1>
+
+ <ul>
+ <li><a href="http://cristal.inria.fr/~fpottier/menhir/">Menhir homepage</a></li>
+
+ <li><a href="http://www.cduce.org/download.html">Ulex homepage</a></li>
+
+ <li><a href="http://code.google.com/p/ocaml-extlib/">ExtLib homepage</a></li>
+
+ <li><a href="http://www.ocaml.info/home/ocaml_sources.html#pcre-ocaml">Pcre-ocaml homepage</a></li>
+
+ <li><a href="http://caml.inria.fr/">Caml language home</a></li>
+
+ <li><a href="http://forge.ocamlcore.org/">Ocaml Forge</a>
+ (CCSS is kindly hosted by Ocaml Forge)</li>
+
+ <li>Dario Teixeira's <a href="http://dario.dse.nl/">homepage</a>
+ and <a href="http://nleyten.com/">blog</a>.
+
+ </ul>
+
+<div id="footer">
+</div>
+
+</div>
+
+</div>
+
+</body>
+
+</html>
+

0 comments on commit c7092a9

Please sign in to comment.
Something went wrong with that request. Please try again.