зеркало из https://github.com/mozilla/pjs.git
226 строки
9.9 KiB
Plaintext
226 строки
9.9 KiB
Plaintext
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
%{
|
|
|
|
/* For flex. Requires support for 8-bit characters and case independence. */
|
|
|
|
#include "cssI.h"
|
|
#include "csstab.h"
|
|
|
|
#undef YY_INPUT
|
|
#define YY_INPUT(buf, result, max_size) css_GetBuf(buf, &result, max_size)
|
|
|
|
#if !defined(__cplusplus) && !(__STDC__) && !defined(__TURBOC__)
|
|
/* Stuff from stdlib.h -- needed by win16 */
|
|
#define YY_MALLOC_DECL \
|
|
extern void free (void *); \
|
|
extern void *malloc (size_t size); \
|
|
extern void *realloc (void *, size_t);
|
|
#endif
|
|
|
|
static int input(void);
|
|
|
|
/* We never take input off of the command line. */
|
|
#define YY_NEVER_INTERACTIVE 1
|
|
|
|
#ifdef CSS_PARSE_DEBUG
|
|
#define RETURN(x) {printf("lex returns %d for '%s'\n",x,css_text);return(x);}
|
|
#else
|
|
#define RETURN(x) return(x)
|
|
#endif
|
|
|
|
%}
|
|
|
|
unicode \\[0-9a-f]{1,4}
|
|
latin1 [¡-ÿ]
|
|
escape {unicode}|\\[ -~¡-ÿ]
|
|
stringchar {escape}|{latin1}|[ !#$%&(-~]
|
|
nmstrt [a-z]|{latin1}|{escape}
|
|
nmchar [-a-z0-9]|{latin1}|{escape}
|
|
ident {nmstrt}{nmchar}*
|
|
name {nmchar}+
|
|
d [0-9]
|
|
notnm [^-a-z0-9\\]|{latin1}
|
|
w [ \t\n]*
|
|
num {d}+|{d}*\.{d}+
|
|
string \"({stringchar}|\')*\"|\'({stringchar}|\")*\'
|
|
hex [0-9a-f]
|
|
hex3 [0-9a-f]{3}
|
|
hex6 [0-9a-f]{6}
|
|
|
|
%x css_comment
|
|
%x css_ignore
|
|
%x css_property
|
|
%x css_value
|
|
%x css_bg
|
|
%x css_font
|
|
%x css_line_height
|
|
%x css_list_style
|
|
%x css_border
|
|
%x css_font_size
|
|
|
|
%s css_after_ident
|
|
|
|
%%
|
|
%{
|
|
|
|
|
|
/* CSS1 17 December 1996, with the following changes:
|
|
* 1. Expand whitespace definition in the rules section.
|
|
* 2. Change default rule action to be silent.
|
|
* 3. Require class names to be an IDENT.
|
|
* 4. Require id names to be an IDENT.
|
|
* 5. Return '.' as a separate lexical token;
|
|
* add DOT and DOT_AFTER_IDENT; remove CLASS and CLASS_AFTER_IDENT
|
|
* 6. Return '#' as a separate lexical token;
|
|
* remove HASH and HASH_AFTER_IDENT.
|
|
* 7. Gut the use of AFTER_IDENT tokens for pseudoclasses and pseudoelements.
|
|
* 8. Provide a definition for HEXCOLOR token.
|
|
* move { and } out into state triggers
|
|
* 9. Gave up on preserving any heritage and made use of exclusive states.
|
|
*/
|
|
|
|
/* These state variables can be on the stack because their state is not
|
|
* useful across a token return. They should always be set to 0 before
|
|
* starting a new input file.
|
|
*/
|
|
short int css_prior_state = 0;
|
|
short int css_nest_count = 0;
|
|
|
|
%}
|
|
\<\!\-\- {BEGIN(0); RETURN(CDO);}
|
|
\-\-\> {BEGIN(0); RETURN(CDC);}
|
|
|
|
<css_after_ident>":"link {BEGIN(0);RETURN(LINK_PSCLASS);}
|
|
<css_after_ident>":"visited {BEGIN(0);RETURN(VISITED_PSCLASS);}
|
|
<css_after_ident>":"active {BEGIN(0);RETURN(ACTIVE_PSCLASS);}
|
|
<css_after_ident>"." {BEGIN(0);RETURN(DOT_AFTER_IDENT);}
|
|
{ident} {BEGIN(css_after_ident); RETURN(IDENT);}
|
|
|
|
":"link {BEGIN(0);RETURN(LEADING_LINK_PSCLASS);}
|
|
":"visited {BEGIN(0);RETURN(LEADING_VISITED_PSCLASS);}
|
|
":"active {BEGIN(0);RETURN(LEADING_ACTIVE_PSCLASS);}
|
|
":"first-line {BEGIN(0);RETURN(FIRST_LINE);}
|
|
":"first-letter {BEGIN(0);RETURN(FIRST_LETTER);}
|
|
"." {BEGIN(0);RETURN(DOT);}
|
|
[,#;] {BEGIN(0);return (*css_text);}
|
|
[ \t\f\v\r\n]+ {BEGIN(0);}
|
|
|
|
@import {BEGIN(0); RETURN(IMPORT_SYM);}
|
|
@fontdef {BEGIN(0); RETURN(FONTDEF);}
|
|
url\({w}{string}{w}\) |
|
|
url\({w}([^ \n\'\")]|\\\ |\\\'|\\\"|\\\))+{w}\) {RETURN(URL);}
|
|
{string} {RETURN(STRING);}
|
|
|
|
@{ident} {BEGIN(css_ignore); css_nest_count=0;}
|
|
<css_ignore>{string} |
|
|
<css_ignore>[^;{}]* { /* unrecognized @rules are ignored. */}
|
|
<css_ignore>";" {if (0 == css_nest_count) BEGIN(0);}
|
|
<css_ignore>"{" {css_nest_count++;}
|
|
<css_ignore>"}" {if (0 >= --css_nest_count) BEGIN(0);}
|
|
|
|
<*>"/*" {if (css_comment != YY_START) {
|
|
/* Comments cannot be nested. */
|
|
css_prior_state = YY_START;}
|
|
BEGIN(css_comment);}
|
|
<css_comment>[^*]* |
|
|
<css_comment>"*"+[^*/]* {/* Comments function as whitespace. */}
|
|
<css_comment>"*"+"/" {BEGIN(css_prior_state);}
|
|
|
|
<css_property,css_value,css_bg,css_font,css_line_height,css_list_style,css_border,css_font_size>[ \t\f\v\r\n]+ {/* whitespace can separate tokens */}
|
|
<css_property,css_value,css_bg,css_font,css_line_height,css_list_style,css_border,css_font_size>"}" {BEGIN(0); return (*css_text);}
|
|
|
|
<css_value,css_bg,css_font,css_line_height,css_list_style,css_border,css_font_size>[;] {BEGIN(css_property); return (*css_text);}
|
|
<css_value,css_bg,css_font,css_line_height,css_list_style,css_border,css_font_size>"!"{w}important {RETURN(IMPORTANT_SYM);}
|
|
|
|
"{" {BEGIN(css_property); return (*css_text);}
|
|
<css_property>[:] {BEGIN(css_value); return (*css_text);}
|
|
<css_property>[-/+;,#] {return (*css_text);}
|
|
<css_property>"background" {BEGIN(css_bg); RETURN(BACKGROUND);}
|
|
<css_property>font {BEGIN(css_font); RETURN(FONT);}
|
|
<css_property>list-style {BEGIN(css_list_style); RETURN(LIST_STYLE);}
|
|
<css_property>border {BEGIN(css_border); RETURN(BORDER);}
|
|
<css_property>font-size {BEGIN(css_font_size); RETURN(FONT_SIZE_PROPERTY);}
|
|
<css_property>{ident} {RETURN(IDENT);}
|
|
|
|
<css_font>italic|oblique {RETURN(FONT_STYLE);}
|
|
<css_font>small-caps {RETURN(FONT_VARIANT);}
|
|
<css_font>bold|bolder|lighter {RETURN(FONT_WEIGHT);}
|
|
<css_font>100|200|300|400|500|600|700|800|900 {RETURN(FONT_WEIGHT);}
|
|
<css_font>normal {RETURN(FONT_NORMAL);}
|
|
<css_font,css_font_size>xx-small|x-small|small|medium {RETURN(FONT_SIZE);}
|
|
<css_font,css_font_size>large|x-large|xx-large|larger|smaller {RETURN(FONT_SIZE);}
|
|
<css_font,css_font_size,css_line_height>{num}"%" {BEGIN(css_font); RETURN(PERCENTAGE);}
|
|
<css_font,css_font_size>0 |
|
|
<css_font,css_font_size,css_line_height>{num}pt/{notnm} |
|
|
<css_font,css_font_size,css_line_height>{num}mm/{notnm} |
|
|
<css_font,css_font_size,css_line_height>{num}cm/{notnm} |
|
|
<css_font,css_font_size,css_line_height>{num}pc/{notnm} |
|
|
<css_font,css_font_size,css_line_height>{num}in/{notnm} |
|
|
<css_font,css_font_size,css_line_height>{num}px/{notnm} {BEGIN(css_font); RETURN(LENGTH);}
|
|
<css_font,css_font_size,css_line_height>{num}em/{notnm} {BEGIN(css_font); RETURN(EMS);}
|
|
<css_font,css_font_size,css_line_height>{num}ex/{notnm} {BEGIN(css_font); RETURN(EXS);}
|
|
<css_font>"/" {BEGIN(css_line_height); return (*css_text);}
|
|
<css_line_height>[-+] {return (*css_text);}
|
|
<css_line_height>{num} {BEGIN(css_font); RETURN(NUMBER);}
|
|
<css_line_height>normal {BEGIN(css_font); RETURN(LINE_HEIGHT);}
|
|
<css_font>{ident} {RETURN(IDENT);}
|
|
<css_font>{string} {RETURN(STRING);}
|
|
<css_font,css_font_size,css_list_style>[:,+] {return (*css_text);}
|
|
|
|
<css_list_style>disc|circle|square|decimal|lower-roman|upper-roman|lower-alpha|upper-alpha {RETURN(LS_TYPE);}
|
|
<css_list_style>none {RETURN(LS_NONE);}
|
|
<css_list_style>inside|outside {RETURN(LS_POSITION);}
|
|
|
|
<css_bg>transparent {RETURN(BG_COLOR);}
|
|
<css_bg>none {RETURN(BG_IMAGE);}
|
|
<css_bg>repeat|repeat-x|repeat-y|no-repeat {RETURN(BG_REPEAT);}
|
|
<css_bg>scroll|fixed {RETURN(BG_ATTACHMENT);}
|
|
<css_bg>left|right|top|center|bottom {RETURN(BG_POSITION);}
|
|
|
|
<css_value,css_bg,css_border>[-/+,#:] {return (*css_text);}
|
|
<css_value,css_bg>{ident} {RETURN(IDENT);}
|
|
<css_value>[)(] {RETURN(IDENT); /* quick b2 hack */}
|
|
<css_value,css_bg>{string} {RETURN(STRING);}
|
|
<css_value,css_bg,css_border>"#"{hex3} |
|
|
<css_value,css_bg,css_border>"#"{hex6} {RETURN(HEXCOLOR);}
|
|
<css_value,css_bg,css_border>rgb\({w}{num}%?{w}\,{w}{num}%?{w}\,{w}{num}%?{w}\) {RETURN(RGB);}
|
|
<css_value,css_bg,css_list_style>url\({w}{string}{w}\) |
|
|
<css_value,css_bg,css_list_style>url\({w}([^ \n\'\")]|\\\ |\\\'|\\\"|\\\))+{w}\) {RETURN(URL);}
|
|
<css_value,css_bg,css_border>{num}"%" {RETURN(PERCENTAGE);}
|
|
<css_value,css_bg,css_border>0 |
|
|
<css_value,css_bg,css_border>{num}pt/{notnm} |
|
|
<css_value,css_bg,css_border>{num}mm/{notnm} |
|
|
<css_value,css_bg,css_border>{num}cm/{notnm} |
|
|
<css_value,css_bg,css_border>{num}pc/{notnm} |
|
|
<css_value,css_bg,css_border>{num}in/{notnm} |
|
|
<css_value,css_bg,css_border>{num}px/{notnm} {RETURN(LENGTH);}
|
|
<css_value,css_bg,css_border>{num}em/{notnm} {RETURN(EMS);}
|
|
<css_value,css_bg,css_border>{num}ex/{notnm} {RETURN(EXS);}
|
|
|
|
<css_value>{num} {RETURN(NUMBER);}
|
|
|
|
<css_border>none|dotted|dashed|solid|double |
|
|
<css_border>groove|ridge|inset|outset {RETURN(BORDER_STYLE);}
|
|
<css_border>thin|medium|thick {RETURN(BORDER_WIDTH);}
|
|
<css_border>{ident} {RETURN(IDENT);}
|
|
|
|
<<EOF>> {BEGIN (0); yyterminate();}
|
|
<*>. {RETURN(WILD);}
|
|
%%
|