diff --git a/src/css-tokens.h b/src/css-tokens.h index 381dbd9f..109ac29a 100644 --- a/src/css-tokens.h +++ b/src/css-tokens.h @@ -32,36 +32,34 @@ as that of the covered work. */ #define CSS_TOKENS_H enum { - CSSEOF, - S, - CDO, - CDC, - INCLUDES, - DASHMATCH, - LBRACE, - PLUS, - GREATER, - COMMA, - STRING, - INVALID, - IDENT, - HASH, - IMPORT_SYM, - PAGE_SYM, - MEDIA_SYM, - CHARSET_SYM, - IMPORTANT_SYM, - EMS, - EXS, - LENGTH, - ANGLE, - TIME, - FREQ, - DIMENSION, - PERCENTAGE, - NUMBER, - URI, - FUNCTION + CSSEOF = 0, + S = 1, + CDO = 2, + CDC = 3, + INCLUDES = 4, + DASHMATCH = 5, + STRING = 6, + BAD_STRING = 7, + IDENT = 8, + HASH = 9, + IMPORT_SYM = 10, + PAGE_SYM = 11, + MEDIA_SYM = 12, + CHARSET_SYM = 13, + IMPORTANT_SYM = 14, + EMS = 15, + EXS = 16, + LENGTH = 17, + ANGLE = 18, + TIME = 19, + FREQ = 20, + DIMENSION = 21, + PERCENTAGE = 22, + NUMBER = 23, + URI = 24, + BAD_URI = 25, + FUNCTION = 26, + COMMENT = 27 }; #endif /* CSS_TOKENS_H */ diff --git a/src/css.l b/src/css.l index 14c05d53..d6c34f6d 100644 --- a/src/css.l +++ b/src/css.l @@ -3,6 +3,12 @@ %option never-interactive %option nounput +%top{ +/* config.h must precede flex's inclusion of + in order for its _GNU_SOURCE definition to take effect. */ +#include +} + %{ /* Lex source for CSS tokenizing. Taken from http://www.w3.org/TR/CSS21/grammar.html#q2 @@ -39,101 +45,123 @@ as that of the covered work. */ #include "css-tokens.h" +#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + #pragma GCC diagnostic ignored "-Wunknown-pragmas" // clang mourns about the next one + #pragma GCC diagnostic ignored "-Wunused-function" + #pragma GCC diagnostic ignored "-Wunused-macros" + #pragma GCC diagnostic ignored "-Wunused-parameter" + #pragma GCC diagnostic ignored "-Wsign-compare" + #pragma GCC diagnostic ignored "-Wswitch-default" + #pragma GCC diagnostic ignored "-Wunreachable-code" // clang + #pragma clang diagnostic ignored "-Wshorten-64-to-32" + #ifndef __clang__ + #pragma GCC diagnostic ignored "-Wsuggest-attribute=pure" + #endif +#endif + %} -h [0-9a-f] -nonascii [\200-\377] -unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])? -escape {unicode}|\\[^\r\n\f0-9a-f] -nmstart [_a-z]|{nonascii}|{escape} -nmchar [_a-z0-9-]|{nonascii}|{escape} -string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" -string2 \'([^\n\r\f\\']|\\{nl}|{escape})*\' -invalid1 \"([^\n\r\f\\"]|\\{nl}|{escape})* -invalid2 \'([^\n\r\f\\']|\\{nl}|{escape})* +h [0-9a-f] +nonascii [\240-\377] +unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])? +escape {unicode}|\\[^\r\n\f0-9a-f] +nmstart [_a-z]|{nonascii}|{escape} +nmchar [_a-z0-9-]|{nonascii}|{escape} +string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" +string2 \'([^\n\r\f\\']|\\{nl}|{escape})*\' +badstring1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\\? +badstring2 \'([^\n\r\f\\']|\\{nl}|{escape})*\\? +badcomment1 \/\*[^*]*\*+([^/*][^*]*\*+)* +badcomment2 \/\*[^*]*(\*+[^/*][^*]*)* +baduri1 url\({w}([!#$%&*-\[\]-~]|{nonascii}|{escape})*{w} +baduri2 url\({w}{string}{w} +baduri3 url\({w}{badstring} +comment \/\*[^*]*\*+([^/*][^*]*\*+)*\/ +ident -?{nmstart}{nmchar}* +name {nmchar}+ +num [0-9]+|[0-9]*"."[0-9]+ +string {string1}|{string2} +badstring {badstring1}|{badstring2} +badcomment {badcomment1}|{badcomment2} +baduri {baduri1}|{baduri2}|{baduri3} +url ([!#$%&*-~]|{nonascii}|{escape})* +s [ \t\r\n\f]+ +w {s}? +nl \n|\r\n|\r|\f -comment \/\*[^*]*\*+([^/*][^*]*\*+)*\/ -ident -?{nmstart}{nmchar}* -name {nmchar}+ -num [0-9]+|[0-9]*"."[0-9]+ -string {string1}|{string2} -invalid {invalid1}|{invalid2} -url ([!#$%&*-~]|{nonascii}|{escape})* -s [ \t\r\n\f] -w ({s}|{comment})* -nl \n|\r\n|\r|\f - -A a|\\0{0,4}(41|61)(\r\n|[ \t\r\n\f])? -C c|\\0{0,4}(43|63)(\r\n|[ \t\r\n\f])? -D d|\\0{0,4}(44|64)(\r\n|[ \t\r\n\f])? -E e|\\0{0,4}(45|65)(\r\n|[ \t\r\n\f])? -G g|\\0{0,4}(47|67)(\r\n|[ \t\r\n\f])?|\\g -H h|\\0{0,4}(48|68)(\r\n|[ \t\r\n\f])?|\\h -I i|\\0{0,4}(49|69)(\r\n|[ \t\r\n\f])?|\\i -K k|\\0{0,4}(4b|6b)(\r\n|[ \t\r\n\f])?|\\k -M m|\\0{0,4}(4d|6d)(\r\n|[ \t\r\n\f])?|\\m -N n|\\0{0,4}(4e|6e)(\r\n|[ \t\r\n\f])?|\\n -P p|\\0{0,4}(50|70)(\r\n|[ \t\r\n\f])?|\\p -R r|\\0{0,4}(52|72)(\r\n|[ \t\r\n\f])?|\\r -S s|\\0{0,4}(53|73)(\r\n|[ \t\r\n\f])?|\\s -T t|\\0{0,4}(54|74)(\r\n|[ \t\r\n\f])?|\\t -X x|\\0{0,4}(58|78)(\r\n|[ \t\r\n\f])?|\\x -Z z|\\0{0,4}(5a|7a)(\r\n|[ \t\r\n\f])?|\\z +A a|\\0{0,4}(41|61)(\r\n|[ \t\r\n\f])? +C c|\\0{0,4}(43|63)(\r\n|[ \t\r\n\f])? +D d|\\0{0,4}(44|64)(\r\n|[ \t\r\n\f])? +E e|\\0{0,4}(45|65)(\r\n|[ \t\r\n\f])? +G g|\\0{0,4}(47|67)(\r\n|[ \t\r\n\f])?|\\g +H h|\\0{0,4}(48|68)(\r\n|[ \t\r\n\f])?|\\h +I i|\\0{0,4}(49|69)(\r\n|[ \t\r\n\f])?|\\i +K k|\\0{0,4}(4b|6b)(\r\n|[ \t\r\n\f])?|\\k +L l|\\0{0,4}(4c|6c)(\r\n|[ \t\r\n\f])?|\\l +M m|\\0{0,4}(4d|6d)(\r\n|[ \t\r\n\f])?|\\m +N n|\\0{0,4}(4e|6e)(\r\n|[ \t\r\n\f])?|\\n +O o|\\0{0,4}(4f|6f)(\r\n|[ \t\r\n\f])?|\\o +P p|\\0{0,4}(50|70)(\r\n|[ \t\r\n\f])?|\\p +R r|\\0{0,4}(52|72)(\r\n|[ \t\r\n\f])?|\\r +S s|\\0{0,4}(53|73)(\r\n|[ \t\r\n\f])?|\\s +T t|\\0{0,4}(54|74)(\r\n|[ \t\r\n\f])?|\\t +U u|\\0{0,4}(55|75)(\r\n|[ \t\r\n\f])?|\\u +X x|\\0{0,4}(58|78)(\r\n|[ \t\r\n\f])?|\\x +Z z|\\0{0,4}(5a|7a)(\r\n|[ \t\r\n\f])?|\\z %% -{s} {return S;} +{s} {return S;} -\/\*[^*]*\*+([^/*][^*]*\*+)*\/ {return S;} /* ignore comments */ +{comment} {return COMMENT;} +#\/\*[^*]*\*+([^/*][^*]*\*+)*\/ /* ignore comments */ +{badcomment} /* unclosed comment at EOF */ -"" {return CDC;} -"~=" {return INCLUDES;} -"|=" {return DASHMATCH;} +"" {return CDC;} +"~=" {return INCLUDES;} +"|=" {return DASHMATCH;} -{w}"{" {return LBRACE;} -{w}"+" {return PLUS;} -{w}">" {return GREATER;} -{w}"," {return COMMA;} +{string} {return STRING;} +{badstring} {return BAD_STRING;} -{string} {return STRING;} -{invalid} {return INVALID; /* unclosed string */} +{ident} {return IDENT;} -{ident} {return IDENT;} +"#"{name} {return HASH;} -"#"{name} {return HASH;} +@{I}{M}{P}{O}{R}{T} {return IMPORT_SYM;} +@{P}{A}{G}{E} {return PAGE_SYM;} +@{M}{E}{D}{I}{A} {return MEDIA_SYM;} +"@charset " {return CHARSET_SYM;} -"@import" {return IMPORT_SYM;} -"@page" {return PAGE_SYM;} -"@media" {return MEDIA_SYM;} -"@charset " {return CHARSET_SYM;} +"!"({w}|{comment})*{I}{M}{P}{O}{R}{T}{A}{N}{T} {return IMPORTANT_SYM;} -"!"{w}"important" {return IMPORTANT_SYM;} +{num}{E}{M} {return EMS;} +{num}{E}{X} {return EXS;} +{num}{P}{X} {return LENGTH;} +{num}{C}{M} {return LENGTH;} +{num}{M}{M} {return LENGTH;} +{num}{I}{N} {return LENGTH;} +{num}{P}{T} {return LENGTH;} +{num}{P}{C} {return LENGTH;} +{num}{D}{E}{G} {return ANGLE;} +{num}{R}{A}{D} {return ANGLE;} +{num}{G}{R}{A}{D} {return ANGLE;} +{num}{M}{S} {return TIME;} +{num}{S} {return TIME;} +{num}{H}{Z} {return FREQ;} +{num}{K}{H}{Z} {return FREQ;} +{num}{ident} {return DIMENSION;} -{num}{E}{M} {return EMS;} -{num}{E}{X} {return EXS;} -{num}{P}{X} {return LENGTH;} -{num}{C}{M} {return LENGTH;} -{num}{M}{M} {return LENGTH;} -{num}{I}{N} {return LENGTH;} -{num}{P}{T} {return LENGTH;} -{num}{P}{C} {return LENGTH;} -{num}{D}{E}{G} {return ANGLE;} -{num}{R}{A}{D} {return ANGLE;} -{num}{G}{R}{A}{D} {return ANGLE;} -{num}{M}{S} {return TIME;} -{num}{S} {return TIME;} -{num}{H}{Z} {return FREQ;} -{num}{K}{H}{Z} {return FREQ;} -{num}{ident} {return DIMENSION;} - -{num}% {return PERCENTAGE;} -{num} {return NUMBER;} +{num}% {return PERCENTAGE;} +{num} {return NUMBER;} "url("{w}{string}{w}")" {return URI;} "url("{w}{url}{w}")" {return URI;} -{ident}"(" {return FUNCTION;} +{baduri} {return BAD_URI;} -. {return *yytext;} +{ident}"(" {return FUNCTION;} + +. {return *yytext;} %%