You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
4.3 KiB
110 lines
4.3 KiB
/*****************************************************************************
|
|
* CSSLexer.l : lexer for simplified CSS, based on W3C spec
|
|
*****************************************************************************
|
|
* Copyright (C) 2017 VideoLabs, VLC authors and VideoLAN
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser 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.
|
|
*****************************************************************************/
|
|
%option case-insensitive
|
|
%option reentrant
|
|
%option bison-bridge
|
|
%option noyywrap
|
|
%option nounput
|
|
%option noinput
|
|
%option never-interactive
|
|
%option nostdinit
|
|
%option prefix="css"
|
|
|
|
%{
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
#include <vlc_common.h>
|
|
#include <vlc_charset.h>
|
|
#include "css_parser.h"
|
|
#include "CSSGrammar.h"
|
|
#define VAL(a, b) { yylval->term.val = (a); yylval->term.type = TYPE_ ## b; }
|
|
char *d;
|
|
%}
|
|
|
|
h [0-9a-fA-F]
|
|
nonascii (?-i:[\200-\377])
|
|
unicode \\{h}{1,6}[ \t\r\n\f]?
|
|
escape (?-i:{unicode}|\\[ -~\200-\377])
|
|
nmstart [a-z]|{nonascii}|{escape}
|
|
nmchar [a-z0-9-]|{nonascii}|{escape}
|
|
string1 \"([\t !#$%&(-~]|\\{nl}|\'|{nonascii}|{escape})*\"
|
|
string2 \'([\t !#$%&(-~]|\\{nl}|\"|{nonascii}|{escape})*\'
|
|
|
|
ident [-]?{nmstart}{nmchar}*
|
|
name {nmchar}+
|
|
num [0-9]+|[0-9]*"."[0-9]+
|
|
string {string1}|{string2}
|
|
url ([!#$%&*-~]|{nonascii}|{escape})*
|
|
w [ \t\r\n\f]*
|
|
nl \n|\r\n|\r|\f
|
|
range \?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h})))))
|
|
|
|
%%
|
|
|
|
[ \t\r\n\f]+ {return WHITESPACE;}
|
|
|
|
\/\*[^*]*\*+([^/][^*]*\*+)*\/ /* ignore comments */
|
|
|
|
"<!--" {return CDO;}
|
|
"-->" {return CDC;}
|
|
"~=" {return INCLUDES;}
|
|
"|=" {return DASHMATCH;}
|
|
"^=" {return BEGINSWITH;}
|
|
"$=" {return ENDSWITH;}
|
|
"*=" {return CONTAINS;}
|
|
|
|
{string} { yylval->string = vlc_css_unquotedunescaped(yytext); return STRING;}
|
|
|
|
{ident} { yylval->string = vlc_css_unescaped(yytext); return IDENT;}
|
|
|
|
"@font-face" {return FONT_FACE_SYM;}
|
|
|
|
"!{w}important" {return IMPORTANT_SYM;}
|
|
|
|
{num}em { VAL( vlc_strtof_c(yytext, &d), EMS ); return LENGTH;}
|
|
{num}ex { VAL( atoi(yytext), EXS ); return LENGTH;}
|
|
{num}px { VAL( atoi(yytext), PIXELS ); return LENGTH;}
|
|
{num}cm { VAL( vlc_strtof_c(yytext, &d) * 10, MILLIMETERS ); return LENGTH;}
|
|
{num}mm { VAL( atoi(yytext), MILLIMETERS ); return LENGTH;}
|
|
{num}in { VAL( vlc_strtof_c(yytext, &d) * 25.4, MILLIMETERS ); return LENGTH;}
|
|
{num}pt { VAL( vlc_strtof_c(yytext, &d), POINTS ); return LENGTH;}
|
|
{num}pc { VAL( vlc_strtof_c(yytext, &d), POINTS ); return LENGTH;}
|
|
{num}deg { VAL( vlc_strtof_c(yytext, &d), DEGREES ); return ANGLE;}
|
|
{num}rad { VAL( vlc_strtof_c(yytext, &d) * 0.0174533, DEGREES ); return ANGLE;}
|
|
{num}grad { VAL( vlc_strtof_c(yytext, &d) * 1.1111111, DEGREES ); return ANGLE;}
|
|
{num}ms { VAL( atoi(yytext), MILLISECONDS ); return TIME;}
|
|
{num}s { VAL( atoi(yytext) * 1000, MILLISECONDS ); return TIME;}
|
|
{num}Hz { VAL( atoi(yytext), HERTZ ); return FREQ;}
|
|
{num}kHz { VAL( atoi(yytext) * 1000, HERTZ ); return FREQ;}
|
|
{num}{ident} { VAL( 0, DIMENSION ); return DIMEN;}
|
|
{num}% { VAL( atoi(yytext), PERCENT ); return PERCENTAGE;}
|
|
{num} { VAL( vlc_strtof_c(yytext, &d), NONE ); return NUMBER;}
|
|
|
|
"url("{w}{string}{w}")" { yylval->string = vlc_css_unquotedunescaped(yytext); return URI;}
|
|
"url("{w}{url}{w}")" { yylval->string = vlc_css_unquotedunescaped(yytext); return URI;}
|
|
{ident}"(" { yylval->string = vlc_css_unescaped(yytext); return FUNCTION;}
|
|
"#"{ident} {yylval->string = vlc_css_unescaped(yytext); return IDSEL;}
|
|
"#"{name} {yylval->string = vlc_css_unescaped(yytext); return HASH;}
|
|
|
|
U\+{range} { yylval->string = strdup(yytext); return UNICODERANGE;}
|
|
U\+{h}{1,6}-{h}{1,6} { yylval->string = strdup(yytext); return UNICODERANGE;}
|
|
|
|
. {return *yytext;}
|
|
|