Index: Source/core/css/CSSGrammar.y |
diff --git a/Source/core/css/CSSGrammar.y b/Source/core/css/CSSGrammar.y |
deleted file mode 100644 |
index ebef4e54950886aa15303539986e85d84b434fc0..0000000000000000000000000000000000000000 |
--- a/Source/core/css/CSSGrammar.y |
+++ /dev/null |
@@ -1,1850 +0,0 @@ |
-%{ |
- |
-/* |
- * Copyright (C) 2002-2003 Lars Knoll (knoll@kde.org) |
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. |
- * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
- * Copyright (C) 2008 Eric Seidel <eric@webkit.org> |
- * Copyright (C) 2012 Intel Corporation. All rights reserved. |
- * |
- * This library 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 of the License, or (at your option) any later version. |
- * |
- * 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 GNU |
- * Lesser General Public License for more details. |
- * |
- * You should have received a copy of the GNU Lesser General Public |
- * License along with this library; if not, write to the Free Software |
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
- * |
- */ |
- |
-#include "config.h" |
- |
-#include "CSSPropertyNames.h" |
-#include "HTMLNames.h" |
-#include "core/css/CSSKeyframeRule.h" |
-#include "core/css/CSSKeyframesRule.h" |
-#include "core/css/parser/BisonCSSParser.h" |
-#include "core/css/CSSParserMode.h" |
-#include "core/css/CSSPrimitiveValue.h" |
-#include "core/css/CSSSelector.h" |
-#include "core/css/CSSSelectorList.h" |
-#include "core/css/MediaList.h" |
-#include "core/css/MediaQueryExp.h" |
-#include "core/css/StyleRule.h" |
-#include "core/css/StyleSheetContents.h" |
-#include "core/dom/Document.h" |
-#include "wtf/FastMalloc.h" |
-#include <stdlib.h> |
-#include <string.h> |
- |
-using namespace blink; |
-using namespace HTMLNames; |
- |
-#define YYMALLOC fastMalloc |
-#define YYFREE fastFree |
- |
-#define YYENABLE_NLS 0 |
-#define YYLTYPE_IS_TRIVIAL 1 |
-#define YYMAXDEPTH 10000 |
-#define YYDEBUG 0 |
- |
-#if YYDEBUG > 0 |
-#define YYPRINT(File,Type,Value) if (isCSSTokenAString(Type)) YYFPRINTF(File, "%s", String((Value).string).utf8().data()) |
-#endif |
- |
-%} |
- |
-%pure-parser |
- |
-%parse-param { BisonCSSParser* parser } |
-%lex-param { BisonCSSParser* parser } |
- |
-%union { |
- bool boolean; |
- char character; |
- int integer; |
- double number; |
- CSSParserString string; |
- |
- StyleRuleBase* rule; |
- // The content of the three below HeapVectors are guaranteed to be kept alive by |
- // the corresponding m_parsedRules, m_floatingMediaQueryExpList, and m_parsedKeyFrames |
- // lists in BisonCSSParser.h. |
- WillBeHeapVector<RefPtrWillBeMember<StyleRuleBase> >* ruleList; |
- WillBeHeapVector<OwnPtrWillBeMember<MediaQueryExp> >* mediaQueryExpList; |
- WillBeHeapVector<RefPtrWillBeMember<StyleKeyframe> >* keyframeRuleList; |
- CSSParserSelector* selector; |
- Vector<OwnPtr<CSSParserSelector> >* selectorList; |
- CSSSelector::MarginBoxType marginBox; |
- CSSSelector::Relation relation; |
- CSSSelector::AttributeMatchType attributeMatchType; |
- MediaQuerySet* mediaList; |
- MediaQuery* mediaQuery; |
- MediaQuery::Restrictor mediaQueryRestrictor; |
- MediaQueryExp* mediaQueryExp; |
- CSSParserValue value; |
- CSSParserValueList* valueList; |
- StyleKeyframe* keyframe; |
- float val; |
- CSSPropertyID id; |
- CSSParserLocation location; |
-} |
- |
-%{ |
- |
-static inline int cssyyerror(void*, const char*) |
-{ |
- return 1; |
-} |
- |
-#if YYDEBUG > 0 |
-static inline bool isCSSTokenAString(int yytype) |
-{ |
- switch (yytype) { |
- case IDENT: |
- case STRING: |
- case NTH: |
- case HEX: |
- case IDSEL: |
- case DIMEN: |
- case INVALIDDIMEN: |
- case URI: |
- case FUNCTION: |
- case ANYFUNCTION: |
- case HOSTFUNCTION: |
- case HOSTCONTEXTFUNCTION: |
- case NOTFUNCTION: |
- case CALCFUNCTION: |
- case UNICODERANGE: |
- return true; |
- default: |
- return false; |
- } |
-} |
-#endif |
- |
-inline static CSSParserValue makeOperatorValue(int value) |
-{ |
- CSSParserValue v; |
- v.id = CSSValueInvalid; |
- v.isInt = false; |
- v.unit = CSSParserValue::Operator; |
- v.iValue = value; |
- return v; |
-} |
- |
-inline static CSSParserValue makeIdentValue(CSSParserString string) |
-{ |
- CSSParserValue v; |
- v.id = cssValueKeywordID(string); |
- v.isInt = false; |
- v.unit = CSSPrimitiveValue::CSS_IDENT; |
- v.string = string; |
- return v; |
-} |
- |
-%} |
- |
-%expect 0 |
- |
-%nonassoc LOWEST_PREC |
- |
-%left UNIMPORTANT_TOK |
- |
-%token WHITESPACE SGML_CD |
-%token TOKEN_EOF 0 |
- |
-%token INCLUDES |
-%token DASHMATCH |
-%token BEGINSWITH |
-%token ENDSWITH |
-%token CONTAINS |
- |
-%token <string> STRING |
-%right <string> IDENT |
-%token <string> NTH |
- |
-%nonassoc <string> HEX |
-%nonassoc <string> IDSEL |
-%nonassoc ':' |
-%nonassoc '.' |
-%nonassoc '[' |
-%nonassoc <string> '*' |
-%nonassoc error |
-%left '|' |
- |
-%token IMPORT_SYM |
-%token PAGE_SYM |
-%token MEDIA_SYM |
-%token SUPPORTS_SYM |
-%token FONT_FACE_SYM |
-%token CHARSET_SYM |
-%token NAMESPACE_SYM |
-%token VIEWPORT_RULE_SYM |
-%token INTERNAL_DECLS_SYM |
-%token INTERNAL_MEDIALIST_SYM |
-%token INTERNAL_RULE_SYM |
-%token INTERNAL_SELECTOR_SYM |
-%token INTERNAL_VALUE_SYM |
-%token INTERNAL_KEYFRAME_RULE_SYM |
-%token INTERNAL_KEYFRAME_KEY_LIST_SYM |
-%token INTERNAL_SUPPORTS_CONDITION_SYM |
-%token KEYFRAMES_SYM |
-%token WEBKIT_KEYFRAMES_SYM |
-%token <marginBox> TOPLEFTCORNER_SYM |
-%token <marginBox> TOPLEFT_SYM |
-%token <marginBox> TOPCENTER_SYM |
-%token <marginBox> TOPRIGHT_SYM |
-%token <marginBox> TOPRIGHTCORNER_SYM |
-%token <marginBox> BOTTOMLEFTCORNER_SYM |
-%token <marginBox> BOTTOMLEFT_SYM |
-%token <marginBox> BOTTOMCENTER_SYM |
-%token <marginBox> BOTTOMRIGHT_SYM |
-%token <marginBox> BOTTOMRIGHTCORNER_SYM |
-%token <marginBox> LEFTTOP_SYM |
-%token <marginBox> LEFTMIDDLE_SYM |
-%token <marginBox> LEFTBOTTOM_SYM |
-%token <marginBox> RIGHTTOP_SYM |
-%token <marginBox> RIGHTMIDDLE_SYM |
-%token <marginBox> RIGHTBOTTOM_SYM |
- |
-%token ATKEYWORD |
- |
-%token IMPORTANT_SYM |
-%token MEDIA_ONLY |
-%token MEDIA_NOT |
-%token MEDIA_AND |
-%token MEDIA_OR |
- |
-%token SUPPORTS_NOT |
-%token SUPPORTS_AND |
-%token SUPPORTS_OR |
- |
-%token <number> REMS |
-%token <number> CHS |
-%token <number> QEMS |
-%token <number> EMS |
-%token <number> EXS |
-%token <number> PXS |
-%token <number> CMS |
-%token <number> MMS |
-%token <number> INS |
-%token <number> PTS |
-%token <number> PCS |
-%token <number> DEGS |
-%token <number> RADS |
-%token <number> GRADS |
-%token <number> TURNS |
-%token <number> MSECS |
-%token <number> SECS |
-%token <number> HERTZ |
-%token <number> KHERTZ |
-%token <string> DIMEN |
-%token <string> INVALIDDIMEN |
-%token <number> PERCENTAGE |
-%token <number> FLOATTOKEN |
-%token <number> INTEGER |
-%token <number> VW |
-%token <number> VH |
-%token <number> VMIN |
-%token <number> VMAX |
-%token <number> DPPX |
-%token <number> DPI |
-%token <number> DPCM |
-%token <number> FR |
- |
-%token <string> URI |
-%token <string> FUNCTION |
-%token <string> ANYFUNCTION |
-%token <string> CUEFUNCTION |
-%token <string> NOTFUNCTION |
-%token <string> DISTRIBUTEDFUNCTION |
-%token <string> CALCFUNCTION |
-%token <string> HOSTFUNCTION |
-%token <string> HOSTCONTEXTFUNCTION |
- |
-%token <string> UNICODERANGE |
- |
-%type <relation> combinator |
- |
-%type <rule> ruleset |
-%type <rule> media |
-%type <rule> import |
-%type <rule> namespace |
-%type <rule> page |
-%type <rule> margin_box |
-%type <rule> font_face |
-%type <rule> keyframes |
-%type <rule> rule |
-%type <rule> valid_rule |
-%type <ruleList> block_rule_body |
-%type <ruleList> block_rule_list |
-%type <rule> block_rule |
-%type <rule> block_valid_rule |
-%type <rule> supports |
-%type <rule> viewport |
-%type <boolean> keyframes_rule_start |
- |
-%type <string> maybe_ns_prefix |
- |
-%type <string> namespace_selector |
- |
-%type <string> string_or_uri |
-%type <string> ident_or_string |
-%type <string> medium |
-%type <marginBox> margin_sym |
- |
-%type <mediaList> media_list |
-%type <mediaList> maybe_media_list |
-%type <mediaList> mq_list |
-%type <mediaQuery> media_query |
-%type <mediaQuery> valid_media_query |
-%type <mediaQueryRestrictor> maybe_media_restrictor |
-%type <valueList> maybe_media_value |
-%type <mediaQueryExp> media_query_exp |
-%type <mediaQueryExpList> media_query_exp_list |
-%type <mediaQueryExpList> maybe_and_media_query_exp_list |
- |
-%type <boolean> supports_condition |
-%type <boolean> supports_condition_in_parens |
-%type <boolean> supports_negation |
-%type <boolean> supports_conjunction |
-%type <boolean> supports_disjunction |
-%type <boolean> supports_declaration_condition |
- |
-%type <string> keyframe_name |
-%type <keyframe> keyframe_rule |
-%type <keyframeRuleList> keyframes_rule |
-%type <keyframeRuleList> keyframe_rule_list |
-%type <valueList> key_list |
-%type <value> key |
- |
-%type <id> property |
- |
-%type <selector> specifier |
-%type <selector> specifier_list |
-%type <selector> simple_selector |
-%type <selector> selector |
-%type <selectorList> selector_list |
-%type <selectorList> simple_selector_list |
-%type <selector> class |
-%type <selector> attrib |
-%type <selector> pseudo |
-%type <selector> pseudo_page |
-%type <selector> page_selector |
- |
-%type <boolean> declaration_list |
-%type <boolean> decl_list |
-%type <boolean> declaration |
-%type <boolean> declarations_and_margins |
- |
-%type <boolean> prio |
- |
-%type <integer> match |
-%type <integer> unary_operator |
-%type <integer> maybe_unary_operator |
-%type <character> operator |
- |
-%type <valueList> expr |
-%type <value> term |
-%type <value> unary_term |
-%type <value> function |
-%type <value> calc_func_term |
-%type <character> calc_func_operator |
-%type <valueList> calc_func_expr |
-%type <valueList> calc_func_paren_expr |
-%type <value> calc_function |
- |
-%type <string> element_name |
-%type <string> attr_name |
- |
-%type <attributeMatchType> attr_match_type |
-%type <attributeMatchType> maybe_attr_match_type |
- |
-%type <location> error_location |
- |
-%type <valueList> ident_list |
-%type <value> track_names_list |
- |
-%% |
- |
-stylesheet: |
- maybe_charset maybe_sgml rule_list |
- | internal_decls |
- | internal_rule |
- | internal_selector |
- | internal_value |
- | internal_medialist |
- | internal_keyframe_rule |
- | internal_keyframe_key_list |
- | internal_supports_condition |
- ; |
- |
-internal_rule: |
- INTERNAL_RULE_SYM maybe_space valid_rule maybe_space TOKEN_EOF { |
- parser->m_rule = $3; |
- } |
-; |
- |
-internal_keyframe_rule: |
- INTERNAL_KEYFRAME_RULE_SYM maybe_space keyframe_rule maybe_space TOKEN_EOF { |
- parser->m_keyframe = $3; |
- } |
-; |
- |
-internal_keyframe_key_list: |
- INTERNAL_KEYFRAME_KEY_LIST_SYM maybe_space key_list TOKEN_EOF { |
- parser->m_valueList = parser->sinkFloatingValueList($3); |
- } |
-; |
- |
-internal_decls: |
- INTERNAL_DECLS_SYM maybe_space_before_declaration declaration_list TOKEN_EOF { |
- /* can be empty */ |
- } |
-; |
- |
-internal_value: |
- INTERNAL_VALUE_SYM maybe_space expr TOKEN_EOF { |
- parser->m_valueList = parser->sinkFloatingValueList($3); |
- int oldParsedProperties = parser->m_parsedProperties.size(); |
- if (!parser->parseValue(parser->m_id, parser->m_important)) |
- parser->rollbackLastProperties(parser->m_parsedProperties.size() - oldParsedProperties); |
- parser->m_valueList = nullptr; |
- } |
-; |
- |
-internal_medialist: |
- INTERNAL_MEDIALIST_SYM maybe_space location_label maybe_media_list TOKEN_EOF { |
- parser->m_mediaList = $4; |
- } |
-; |
- |
-internal_selector: |
- INTERNAL_SELECTOR_SYM maybe_space selector_list TOKEN_EOF { |
- if (parser->m_selectorListForParseSelector) |
- parser->m_selectorListForParseSelector->adoptSelectorVector(*$3); |
- } |
-; |
- |
-internal_supports_condition: |
- INTERNAL_SUPPORTS_CONDITION_SYM maybe_space supports_condition TOKEN_EOF { |
- parser->m_supportsCondition = $3; |
- } |
-; |
- |
-space: |
- WHITESPACE |
- | space WHITESPACE |
- ; |
- |
-maybe_space: |
- /* empty */ %prec UNIMPORTANT_TOK |
- | space |
- ; |
- |
-maybe_sgml: |
- /* empty */ |
- | maybe_sgml SGML_CD |
- | maybe_sgml WHITESPACE |
- ; |
- |
-closing_brace: |
- '}' |
- | %prec LOWEST_PREC TOKEN_EOF |
- ; |
- |
-closing_parenthesis: |
- ')' |
- | %prec LOWEST_PREC TOKEN_EOF |
- ; |
- |
-closing_square_bracket: |
- ']' |
- | %prec LOWEST_PREC TOKEN_EOF |
- ; |
- |
-semi_or_eof: |
- ';' |
- | TOKEN_EOF |
- ; |
- |
-maybe_charset: |
- /* empty */ |
- | CHARSET_SYM maybe_space STRING maybe_space semi_or_eof { |
- if (parser->m_styleSheet) |
- parser->m_styleSheet->parserSetEncodingFromCharsetRule($3); |
- parser->startEndUnknownRule(); |
- } |
- | CHARSET_SYM at_rule_recovery |
- ; |
- |
-rule_list: |
- /* empty */ |
- | rule_list rule maybe_sgml { |
- if ($2 && parser->m_styleSheet) |
- parser->m_styleSheet->parserAppendRule($2); |
- } |
- ; |
- |
-valid_rule: |
- ruleset |
- | media |
- | page |
- | font_face |
- | keyframes |
- | namespace |
- | import |
- | supports |
- | viewport |
- ; |
- |
-before_rule: |
- /* empty */ { |
- parser->startRule(); |
- } |
- ; |
- |
-rule: |
- before_rule valid_rule { |
- $$ = $2; |
- parser->m_hadSyntacticallyValidCSSRule = true; |
- parser->endRule(!!$$); |
- } |
- | before_rule invalid_rule { |
- $$ = 0; |
- parser->endRule(false); |
- } |
- ; |
- |
-block_rule_body: |
- block_rule_list |
- | block_rule_list block_rule_recovery |
- ; |
- |
-block_rule_list: |
- /* empty */ { $$ = 0; } |
- | block_rule_list block_rule maybe_sgml { |
- $$ = parser->appendRule($1, $2); |
- } |
- ; |
- |
-block_rule_recovery: |
- before_rule invalid_rule_header { |
- parser->endRule(false); |
- } |
- ; |
- |
-block_valid_rule: |
- ruleset |
- | page |
- | font_face |
- | media |
- | keyframes |
- | supports |
- | viewport |
- | namespace |
- ; |
- |
-block_rule: |
- before_rule block_valid_rule { |
- $$ = $2; |
- parser->endRule(!!$$); |
- } |
- | before_rule invalid_rule { |
- $$ = 0; |
- parser->endRule(false); |
- } |
- ; |
- |
-before_import_rule: |
- /* empty */ { |
- parser->startRuleHeader(CSSRuleSourceData::IMPORT_RULE); |
- } |
- ; |
- |
-import_rule_start: |
- before_import_rule IMPORT_SYM maybe_space { |
- parser->endRuleHeader(); |
- parser->startRuleBody(); |
- } |
- ; |
- |
-import: |
- import_rule_start string_or_uri maybe_space location_label maybe_media_list semi_or_eof { |
- $$ = parser->createImportRule($2, $5); |
- } |
- | import_rule_start string_or_uri maybe_space location_label maybe_media_list invalid_block { |
- $$ = 0; |
- } |
- ; |
- |
-namespace: |
- NAMESPACE_SYM maybe_space maybe_ns_prefix string_or_uri maybe_space semi_or_eof { |
- parser->addNamespace($3, $4); |
- $$ = 0; |
- } |
- ; |
- |
-maybe_ns_prefix: |
-/* empty */ { $$.clear(); } |
-| IDENT maybe_space |
-; |
- |
-string_or_uri: |
-STRING |
-| URI |
-; |
- |
-maybe_media_value: |
- /*empty*/ { |
- $$ = 0; |
- } |
- | ':' maybe_space expr { |
- $$ = $3; |
- } |
- ; |
- |
-media_query_exp: |
- '(' maybe_space IDENT maybe_space maybe_media_value closing_parenthesis { |
- parser->tokenToLowerCase($3); |
- $$ = parser->createFloatingMediaQueryExp($3, $5); |
- if (!$$) |
- YYERROR; |
- } |
- | '(' error error_recovery closing_parenthesis { |
- YYERROR; |
- } |
- ; |
- |
-media_query_exp_list: |
- media_query_exp { |
- $$ = parser->createFloatingMediaQueryExpList(); |
- $$->append(parser->sinkFloatingMediaQueryExp($1)); |
- } |
- | media_query_exp_list maybe_space MEDIA_AND maybe_space media_query_exp { |
- $$ = $1; |
- $$->append(parser->sinkFloatingMediaQueryExp($5)); |
- } |
- ; |
- |
-maybe_and_media_query_exp_list: |
- maybe_space { |
- $$ = parser->createFloatingMediaQueryExpList(); |
- } |
- | maybe_space MEDIA_AND maybe_space media_query_exp_list maybe_space { |
- $$ = $4; |
- } |
- ; |
- |
-maybe_media_restrictor: |
- /*empty*/ { |
- $$ = MediaQuery::None; |
- } |
- | MEDIA_ONLY maybe_space { |
- $$ = MediaQuery::Only; |
- } |
- | MEDIA_NOT maybe_space { |
- $$ = MediaQuery::Not; |
- } |
- ; |
- |
-valid_media_query: |
- media_query_exp_list maybe_space { |
- $$ = parser->createFloatingMediaQuery(parser->sinkFloatingMediaQueryExpList($1)); |
- } |
- | maybe_media_restrictor medium maybe_and_media_query_exp_list { |
- parser->tokenToLowerCase($2); |
- $$ = parser->createFloatingMediaQuery($1, $2, parser->sinkFloatingMediaQueryExpList($3)); |
- } |
- ; |
- |
-media_query: |
- valid_media_query |
- | valid_media_query error error_location rule_error_recovery { |
- parser->reportError(parser->lastLocationLabel(), InvalidMediaQueryCSSError); |
- $$ = parser->createFloatingNotAllQuery(); |
- } |
- | error error_location rule_error_recovery { |
- parser->reportError(parser->lastLocationLabel(), InvalidMediaQueryCSSError); |
- $$ = parser->createFloatingNotAllQuery(); |
- } |
- ; |
- |
-maybe_media_list: |
- /* empty */ { |
- $$ = parser->createMediaQuerySet(); |
- } |
- | media_list |
- ; |
- |
-media_list: |
- media_query { |
- $$ = parser->createMediaQuerySet(); |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($1)); |
- } |
- | mq_list media_query { |
- $$ = $1; |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($2)); |
- } |
- | mq_list { |
- $$ = $1; |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery(parser->createFloatingNotAllQuery())); |
- } |
- ; |
- |
-mq_list: |
- media_query ',' maybe_space location_label { |
- $$ = parser->createMediaQuerySet(); |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($1)); |
- } |
- | mq_list media_query ',' maybe_space location_label { |
- $$ = $1; |
- $$->addMediaQuery(parser->sinkFloatingMediaQuery($2)); |
- } |
- ; |
- |
-at_rule_body_start: |
- /* empty */ { |
- parser->startRuleBody(); |
- } |
- ; |
- |
-before_media_rule: |
- /* empty */ { |
- parser->startRuleHeader(CSSRuleSourceData::MEDIA_RULE); |
- } |
- ; |
- |
-at_rule_header_end_maybe_space: |
- maybe_space { |
- parser->endRuleHeader(); |
- } |
- ; |
- |
-media_rule_start: |
- before_media_rule MEDIA_SYM maybe_space; |
- |
-media: |
- media_rule_start maybe_media_list '{' at_rule_header_end at_rule_body_start maybe_space block_rule_body closing_brace { |
- $$ = parser->createMediaRule($2, $7); |
- } |
- ; |
- |
-medium: |
- IDENT |
- ; |
- |
-supports: |
- before_supports_rule SUPPORTS_SYM maybe_space supports_condition at_supports_rule_header_end '{' at_rule_body_start maybe_space block_rule_body closing_brace { |
- $$ = parser->createSupportsRule($4, $9); |
- } |
- ; |
- |
-before_supports_rule: |
- /* empty */ { |
- parser->startRuleHeader(CSSRuleSourceData::SUPPORTS_RULE); |
- parser->markSupportsRuleHeaderStart(); |
- } |
- ; |
- |
-at_supports_rule_header_end: |
- /* empty */ { |
- parser->endRuleHeader(); |
- parser->markSupportsRuleHeaderEnd(); |
- } |
- ; |
- |
-supports_condition: |
- supports_condition_in_parens |
- | supports_negation |
- | supports_conjunction |
- | supports_disjunction |
- ; |
- |
-supports_negation: |
- SUPPORTS_NOT maybe_space supports_condition_in_parens { |
- $$ = !$3; |
- } |
- ; |
- |
-supports_conjunction: |
- supports_condition_in_parens SUPPORTS_AND maybe_space supports_condition_in_parens { |
- $$ = $1 && $4; |
- } |
- | supports_conjunction SUPPORTS_AND maybe_space supports_condition_in_parens { |
- $$ = $1 && $4; |
- } |
- ; |
- |
-supports_disjunction: |
- supports_condition_in_parens SUPPORTS_OR maybe_space supports_condition_in_parens { |
- $$ = $1 || $4; |
- } |
- | supports_disjunction SUPPORTS_OR maybe_space supports_condition_in_parens { |
- $$ = $1 || $4; |
- } |
- ; |
- |
-supports_condition_in_parens: |
- '(' maybe_space supports_condition closing_parenthesis maybe_space { |
- $$ = $3; |
- } |
- | supports_declaration_condition |
- | '(' error error_location error_recovery closing_parenthesis maybe_space { |
- parser->reportError($3, InvalidSupportsConditionCSSError); |
- $$ = false; |
- } |
- ; |
- |
-supports_declaration_condition: |
- '(' maybe_space IDENT maybe_space ':' maybe_space expr prio closing_parenthesis maybe_space { |
- $$ = false; |
- CSSPropertyID id = cssPropertyID($3); |
- if (id != CSSPropertyInvalid) { |
- parser->m_valueList = parser->sinkFloatingValueList($7); |
- int oldParsedProperties = parser->m_parsedProperties.size(); |
- $$ = parser->parseValue(id, $8); |
- // We just need to know if the declaration is supported as it is written. Rollback any additions. |
- if ($$) |
- parser->rollbackLastProperties(parser->m_parsedProperties.size() - oldParsedProperties); |
- } |
- parser->m_valueList = nullptr; |
- parser->endProperty($8, false); |
- } |
- | '(' maybe_space IDENT maybe_space ':' maybe_space error error_recovery closing_parenthesis maybe_space { |
- $$ = false; |
- parser->endProperty(false, false, GeneralCSSError); |
- } |
- ; |
- |
-before_keyframes_rule: |
- /* empty */ { |
- parser->startRuleHeader(CSSRuleSourceData::KEYFRAMES_RULE); |
- } |
- ; |
- |
-keyframes_rule_start: |
- before_keyframes_rule KEYFRAMES_SYM maybe_space { |
- $$ = false; |
- } |
- | before_keyframes_rule WEBKIT_KEYFRAMES_SYM maybe_space { |
- $$ = true; |
- } |
- ; |
- |
-keyframes: |
- keyframes_rule_start keyframe_name at_rule_header_end_maybe_space '{' at_rule_body_start maybe_space location_label keyframes_rule closing_brace { |
- $$ = parser->createKeyframesRule($2, parser->sinkFloatingKeyframeVector($8), $1 /* isPrefixed */); |
- } |
- ; |
- |
-keyframe_name: |
- IDENT |
- | STRING |
- ; |
- |
-keyframes_rule: |
- keyframe_rule_list |
- | keyframe_rule_list keyframes_error_recovery { |
- parser->clearProperties(); |
- }; |
- |
-keyframe_rule_list: |
- /* empty */ { |
- $$ = parser->createFloatingKeyframeVector(); |
- parser->resumeErrorLogging(); |
- } |
- | keyframe_rule_list keyframe_rule maybe_space location_label { |
- $$ = $1; |
- $$->append($2); |
- } |
- | keyframe_rule_list keyframes_error_recovery invalid_block maybe_space location_label { |
- parser->clearProperties(); |
- parser->resumeErrorLogging(); |
- } |
- ; |
- |
-keyframe_rule: |
- key_list '{' maybe_space declaration_list closing_brace { |
- $$ = parser->createKeyframe($1); |
- } |
- ; |
- |
-key_list: |
- key maybe_space { |
- $$ = parser->createFloatingValueList(); |
- $$->addValue(parser->sinkFloatingValue($1)); |
- } |
- | key_list ',' maybe_space key maybe_space { |
- $$ = $1; |
- $$->addValue(parser->sinkFloatingValue($4)); |
- } |
- ; |
- |
-key: |
- maybe_unary_operator PERCENTAGE { |
- $$.setFromNumber($1 * $2); |
- } |
- | IDENT { |
- if ($1.equalIgnoringCase("from")) |
- $$.setFromNumber(0); |
- else if ($1.equalIgnoringCase("to")) |
- $$.setFromNumber(100); |
- else { |
- YYERROR; |
- } |
- } |
- ; |
- |
-keyframes_error_recovery: |
- error rule_error_recovery { |
- parser->reportError(parser->lastLocationLabel(), InvalidKeyframeSelectorCSSError); |
- } |
- ; |
- |
-before_page_rule: |
- /* empty */ { |
- parser->startRuleHeader(CSSRuleSourceData::PAGE_RULE); |
- } |
- ; |
- |
-page: |
- before_page_rule PAGE_SYM maybe_space page_selector at_rule_header_end |
- '{' at_rule_body_start maybe_space_before_declaration declarations_and_margins closing_brace { |
- if ($4) |
- $$ = parser->createPageRule(parser->sinkFloatingSelector($4)); |
- else { |
- // Clear properties in the invalid @page rule. |
- parser->clearProperties(); |
- // Also clear margin at-rules here once we fully implement margin at-rules parsing. |
- $$ = 0; |
- } |
- } |
- ; |
- |
-page_selector: |
- IDENT maybe_space { |
- $$ = parser->createFloatingSelectorWithTagName(QualifiedName(nullAtom, $1, parser->m_defaultNamespace)); |
- $$->setForPage(); |
- } |
- | IDENT pseudo_page maybe_space { |
- $$ = $2; |
- $$->prependTagSelector(QualifiedName(nullAtom, $1, parser->m_defaultNamespace)); |
- $$->setForPage(); |
- } |
- | pseudo_page maybe_space { |
- $$ = $1; |
- $$->setForPage(); |
- } |
- | /* empty */ { |
- $$ = parser->createFloatingSelector(); |
- $$->setForPage(); |
- } |
- ; |
- |
-declarations_and_margins: |
- declaration_list |
- | declarations_and_margins margin_box maybe_space declaration_list |
- ; |
- |
-margin_box: |
- margin_sym { |
- parser->startDeclarationsForMarginBox(); |
- } maybe_space '{' maybe_space declaration_list closing_brace { |
- $$ = parser->createMarginAtRule($1); |
- } |
- ; |
- |
-margin_sym : |
- TOPLEFTCORNER_SYM { |
- $$ = CSSSelector::TopLeftCornerMarginBox; |
- } |
- | TOPLEFT_SYM { |
- $$ = CSSSelector::TopLeftMarginBox; |
- } |
- | TOPCENTER_SYM { |
- $$ = CSSSelector::TopCenterMarginBox; |
- } |
- | TOPRIGHT_SYM { |
- $$ = CSSSelector::TopRightMarginBox; |
- } |
- | TOPRIGHTCORNER_SYM { |
- $$ = CSSSelector::TopRightCornerMarginBox; |
- } |
- | BOTTOMLEFTCORNER_SYM { |
- $$ = CSSSelector::BottomLeftCornerMarginBox; |
- } |
- | BOTTOMLEFT_SYM { |
- $$ = CSSSelector::BottomLeftMarginBox; |
- } |
- | BOTTOMCENTER_SYM { |
- $$ = CSSSelector::BottomCenterMarginBox; |
- } |
- | BOTTOMRIGHT_SYM { |
- $$ = CSSSelector::BottomRightMarginBox; |
- } |
- | BOTTOMRIGHTCORNER_SYM { |
- $$ = CSSSelector::BottomRightCornerMarginBox; |
- } |
- | LEFTTOP_SYM { |
- $$ = CSSSelector::LeftTopMarginBox; |
- } |
- | LEFTMIDDLE_SYM { |
- $$ = CSSSelector::LeftMiddleMarginBox; |
- } |
- | LEFTBOTTOM_SYM { |
- $$ = CSSSelector::LeftBottomMarginBox; |
- } |
- | RIGHTTOP_SYM { |
- $$ = CSSSelector::RightTopMarginBox; |
- } |
- | RIGHTMIDDLE_SYM { |
- $$ = CSSSelector::RightMiddleMarginBox; |
- } |
- | RIGHTBOTTOM_SYM { |
- $$ = CSSSelector::RightBottomMarginBox; |
- } |
- ; |
- |
-before_font_face_rule: |
- /* empty */ { |
- parser->startRuleHeader(CSSRuleSourceData::FONT_FACE_RULE); |
- } |
- ; |
- |
-font_face: |
- before_font_face_rule FONT_FACE_SYM at_rule_header_end_maybe_space |
- '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { |
- $$ = parser->createFontFaceRule(); |
- } |
- ; |
- |
-before_viewport_rule: |
- /* empty */ { |
- parser->markViewportRuleBodyStart(); |
- parser->startRuleHeader(CSSRuleSourceData::VIEWPORT_RULE); |
- } |
- ; |
- |
-viewport: |
- before_viewport_rule VIEWPORT_RULE_SYM at_rule_header_end_maybe_space |
- '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { |
- $$ = parser->createViewportRule(); |
- parser->markViewportRuleBodyEnd(); |
- } |
-; |
- |
-combinator: |
- '+' maybe_space { $$ = CSSSelector::DirectAdjacent; } |
- | '~' maybe_space { $$ = CSSSelector::IndirectAdjacent; } |
- | '>' maybe_space { $$ = CSSSelector::Child; } |
- | '/' IDENT '/' maybe_space { |
- if ($2.equalIgnoringCase("deep")) |
- $$ = CSSSelector::ShadowDeep; |
- else |
- YYERROR; |
- } |
- ; |
- |
-maybe_unary_operator: |
- unary_operator |
- | /* empty */ { $$ = 1; } |
- ; |
- |
-unary_operator: |
- '-' { $$ = -1; } |
- | '+' { $$ = 1; } |
- ; |
- |
-maybe_space_before_declaration: |
- maybe_space { |
- parser->startProperty(); |
- } |
- ; |
- |
-before_selector_list: |
- /* empty */ { |
- parser->startRuleHeader(CSSRuleSourceData::STYLE_RULE); |
- parser->startSelector(); |
- } |
- ; |
- |
-at_rule_header_end: |
- /* empty */ { |
- parser->endRuleHeader(); |
- } |
- ; |
- |
-at_selector_end: |
- /* empty */ { |
- parser->endSelector(); |
- } |
- ; |
- |
-ruleset: |
- before_selector_list selector_list at_selector_end at_rule_header_end '{' at_rule_body_start maybe_space_before_declaration declaration_list closing_brace { |
- $$ = parser->createStyleRule($2); |
- } |
- ; |
- |
-before_selector_group_item: |
- /* empty */ { |
- parser->startSelector(); |
- } |
- |
-selector_list: |
- selector %prec UNIMPORTANT_TOK { |
- $$ = parser->reusableSelectorVector(); |
- $$->shrink(0); |
- $$->append(parser->sinkFloatingSelector($1)); |
- } |
- | selector_list at_selector_end ',' maybe_space before_selector_group_item selector %prec UNIMPORTANT_TOK { |
- $$ = $1; |
- $$->append(parser->sinkFloatingSelector($6)); |
- } |
- ; |
- |
-selector: |
- simple_selector |
- | selector WHITESPACE |
- | selector WHITESPACE simple_selector |
- { |
- $$ = $3; |
- CSSParserSelector* end = $$; |
- while (end->tagHistory()) |
- end = end->tagHistory(); |
- end->setRelation(CSSSelector::Descendant); |
- if ($1->isContentPseudoElement()) |
- end->setRelationIsAffectedByPseudoContent(); |
- end->setTagHistory(parser->sinkFloatingSelector($1)); |
- } |
- | selector combinator simple_selector { |
- $$ = $3; |
- CSSParserSelector* end = $$; |
- while (end->tagHistory()) |
- end = end->tagHistory(); |
- end->setRelation($2); |
- if ($1->isContentPseudoElement()) |
- end->setRelationIsAffectedByPseudoContent(); |
- end->setTagHistory(parser->sinkFloatingSelector($1)); |
- } |
- ; |
- |
-namespace_selector: |
- /* empty */ '|' { $$.clear(); } |
- | '*' '|' { static const LChar star = '*'; $$.init(&star, 1); } |
- | IDENT '|' |
- ; |
- |
-simple_selector: |
- element_name { |
- $$ = parser->createFloatingSelectorWithTagName(QualifiedName(nullAtom, $1, parser->m_defaultNamespace)); |
- } |
- | element_name specifier_list { |
- $$ = parser->rewriteSpecifiersWithElementName(nullAtom, $1, $2); |
- if (!$$) |
- YYERROR; |
- } |
- | specifier_list { |
- $$ = parser->rewriteSpecifiersWithNamespaceIfNeeded($1); |
- if (!$$) |
- YYERROR; |
- } |
- | namespace_selector element_name { |
- $$ = parser->createFloatingSelectorWithTagName(parser->determineNameInNamespace($1, $2)); |
- if (!$$) |
- YYERROR; |
- } |
- | namespace_selector element_name specifier_list { |
- $$ = parser->rewriteSpecifiersWithElementName($1, $2, $3); |
- if (!$$) |
- YYERROR; |
- } |
- | namespace_selector specifier_list { |
- $$ = parser->rewriteSpecifiersWithElementName($1, starAtom, $2); |
- if (!$$) |
- YYERROR; |
- } |
- ; |
- |
-simple_selector_list: |
- simple_selector %prec UNIMPORTANT_TOK { |
- $$ = parser->createFloatingSelectorVector(); |
- $$->append(parser->sinkFloatingSelector($1)); |
- } |
- | simple_selector_list maybe_space ',' maybe_space simple_selector %prec UNIMPORTANT_TOK { |
- $$ = $1; |
- $$->append(parser->sinkFloatingSelector($5)); |
- } |
- ; |
- |
-element_name: |
- IDENT { |
- if (parser->m_context.isHTMLDocument()) |
- parser->tokenToLowerCase($1); |
- $$ = $1; |
- } |
- | '*' { |
- static const LChar star = '*'; |
- $$.init(&star, 1); |
- } |
- ; |
- |
-specifier_list: |
- specifier |
- | specifier_list specifier { |
- $$ = parser->rewriteSpecifiers($1, $2); |
- } |
-; |
- |
-specifier: |
- IDSEL { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::Id); |
- if (isQuirksModeBehavior(parser->m_context.mode())) |
- parser->tokenToLowerCase($1); |
- $$->setValue($1); |
- } |
- | HEX { |
- if ($1[0] >= '0' && $1[0] <= '9') { |
- YYERROR; |
- } else { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::Id); |
- if (isQuirksModeBehavior(parser->m_context.mode())) |
- parser->tokenToLowerCase($1); |
- $$->setValue($1); |
- } |
- } |
- | class |
- | attrib |
- | pseudo |
- ; |
- |
-class: |
- '.' IDENT { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::Class); |
- if (isQuirksModeBehavior(parser->m_context.mode())) |
- parser->tokenToLowerCase($2); |
- $$->setValue($2); |
- } |
- ; |
- |
-attr_name: |
- IDENT maybe_space { |
- if (parser->m_context.isHTMLDocument()) |
- parser->tokenToLowerCase($1); |
- $$ = $1; |
- } |
- ; |
- |
-attr_match_type: |
- IDENT maybe_space { |
- CSSSelector::AttributeMatchType attrMatchType = CSSSelector::CaseSensitive; |
- if (!parser->parseAttributeMatchType(attrMatchType, $1)) |
- YYERROR; |
- $$ = attrMatchType; |
- } |
- ; |
- |
-maybe_attr_match_type: |
- attr_match_type |
- | /* empty */ { $$ = CSSSelector::CaseSensitive; } |
- ; |
- |
-attrib: |
- '[' maybe_space attr_name closing_square_bracket { |
- $$ = parser->createFloatingSelector(); |
- $$->setAttribute(QualifiedName(nullAtom, $3, nullAtom), CSSSelector::CaseSensitive); |
- $$->setMatch(CSSSelector::Set); |
- } |
- | '[' maybe_space attr_name match maybe_space ident_or_string maybe_space maybe_attr_match_type closing_square_bracket { |
- $$ = parser->createFloatingSelector(); |
- $$->setAttribute(QualifiedName(nullAtom, $3, nullAtom), $8); |
- $$->setMatch((CSSSelector::Match)$4); |
- $$->setValue($6); |
- } |
- | '[' maybe_space namespace_selector attr_name closing_square_bracket { |
- $$ = parser->createFloatingSelector(); |
- $$->setAttribute(parser->determineNameInNamespace($3, $4), CSSSelector::CaseSensitive); |
- $$->setMatch(CSSSelector::Set); |
- } |
- | '[' maybe_space namespace_selector attr_name match maybe_space ident_or_string maybe_space maybe_attr_match_type closing_square_bracket { |
- $$ = parser->createFloatingSelector(); |
- $$->setAttribute(parser->determineNameInNamespace($3, $4), $9); |
- $$->setMatch((CSSSelector::Match)$5); |
- $$->setValue($7); |
- } |
- | '[' selector_recovery closing_square_bracket { |
- YYERROR; |
- } |
- ; |
- |
-match: |
- '=' { |
- $$ = CSSSelector::Exact; |
- } |
- | INCLUDES { |
- $$ = CSSSelector::List; |
- } |
- | DASHMATCH { |
- $$ = CSSSelector::Hyphen; |
- } |
- | BEGINSWITH { |
- $$ = CSSSelector::Begin; |
- } |
- | ENDSWITH { |
- $$ = CSSSelector::End; |
- } |
- | CONTAINS { |
- $$ = CSSSelector::Contain; |
- } |
- ; |
- |
-ident_or_string: |
- IDENT |
- | STRING |
- ; |
- |
-pseudo_page: |
- ':' IDENT { |
- if ($2.isFunction()) |
- YYERROR; |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PagePseudoClass); |
- parser->tokenToLowerCase($2); |
- $$->setValue($2); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type == CSSSelector::PseudoUnknown) |
- YYERROR; |
- } |
- |
-pseudo: |
- ':' error_location IDENT { |
- if ($3.isFunction()) |
- YYERROR; |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- parser->tokenToLowerCase($3); |
- $$->setValue($3); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type == CSSSelector::PseudoUnknown) { |
- parser->reportError($2, InvalidSelectorPseudoCSSError); |
- YYERROR; |
- } |
- } |
- | ':' ':' error_location IDENT { |
- if ($4.isFunction()) |
- YYERROR; |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoElement); |
- parser->tokenToLowerCase($4); |
- $$->setValue($4); |
- // FIXME: This call is needed to force selector to compute the pseudoType early enough. |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type == CSSSelector::PseudoUnknown) { |
- parser->reportError($3, InvalidSelectorPseudoCSSError); |
- YYERROR; |
- } |
- } |
- // used by ::cue(:past/:future) |
- | ':' ':' CUEFUNCTION maybe_space simple_selector_list maybe_space closing_parenthesis { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoElement); |
- $$->adoptSelectorVector(*parser->sinkFloatingSelectorVector($5)); |
- $$->setValue($3); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type != CSSSelector::PseudoCue) |
- YYERROR; |
- } |
- | ':' ':' CUEFUNCTION selector_recovery closing_parenthesis { |
- YYERROR; |
- } |
- // use by :-webkit-any. |
- // FIXME: should we support generic selectors here or just simple_selectors? |
- // Use simple_selector_list for now to match -moz-any. |
- // See http://lists.w3.org/Archives/Public/www-style/2010Sep/0566.html for some |
- // related discussion with respect to :not. |
- | ':' ANYFUNCTION maybe_space simple_selector_list maybe_space closing_parenthesis { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- $$->adoptSelectorVector(*parser->sinkFloatingSelectorVector($4)); |
- parser->tokenToLowerCase($2); |
- $$->setValue($2); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type != CSSSelector::PseudoAny) |
- YYERROR; |
- } |
- | ':' ANYFUNCTION selector_recovery closing_parenthesis { |
- YYERROR; |
- } |
- // used by :nth-*(ax+b) |
- | ':' FUNCTION maybe_space NTH maybe_space closing_parenthesis { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- $$->setArgument($4); |
- $$->setValue($2); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type == CSSSelector::PseudoUnknown) |
- YYERROR; |
- } |
- // used by :nth-* |
- | ':' FUNCTION maybe_space maybe_unary_operator INTEGER maybe_space closing_parenthesis { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- $$->setArgument(AtomicString::number($4 * $5)); |
- $$->setValue($2); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type == CSSSelector::PseudoUnknown) |
- YYERROR; |
- } |
- // used by :nth-*(odd/even) and :lang |
- | ':' FUNCTION maybe_space IDENT maybe_space closing_parenthesis { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- $$->setArgument($4); |
- parser->tokenToLowerCase($2); |
- $$->setValue($2); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type == CSSSelector::PseudoUnknown) |
- YYERROR; |
- else if (type == CSSSelector::PseudoNthChild || |
- type == CSSSelector::PseudoNthOfType || |
- type == CSSSelector::PseudoNthLastChild || |
- type == CSSSelector::PseudoNthLastOfType) { |
- if (!isValidNthToken($4)) |
- YYERROR; |
- } |
- } |
- | ':' FUNCTION selector_recovery closing_parenthesis { |
- YYERROR; |
- } |
- // used by :not |
- | ':' NOTFUNCTION maybe_space simple_selector maybe_space closing_parenthesis { |
- if (!$4->isSimple()) |
- YYERROR; |
- else { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- |
- Vector<OwnPtr<CSSParserSelector> > selectorVector; |
- selectorVector.append(parser->sinkFloatingSelector($4)); |
- $$->adoptSelectorVector(selectorVector); |
- |
- parser->tokenToLowerCase($2); |
- $$->setValue($2); |
- } |
- } |
- | ':' NOTFUNCTION selector_recovery closing_parenthesis { |
- YYERROR; |
- } |
- | ':' HOSTFUNCTION maybe_space simple_selector_list maybe_space closing_parenthesis { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- $$->adoptSelectorVector(*parser->sinkFloatingSelectorVector($4)); |
- parser->tokenToLowerCase($2); |
- $$->setValue($2); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type != CSSSelector::PseudoHost) |
- YYERROR; |
- } |
- | ':' HOSTFUNCTION selector_recovery closing_parenthesis { |
- YYERROR; |
- } |
- // used by :host-context() |
- | ':' HOSTCONTEXTFUNCTION maybe_space simple_selector_list maybe_space closing_parenthesis { |
- $$ = parser->createFloatingSelector(); |
- $$->setMatch(CSSSelector::PseudoClass); |
- $$->adoptSelectorVector(*parser->sinkFloatingSelectorVector($4)); |
- parser->tokenToLowerCase($2); |
- $$->setValue($2); |
- CSSSelector::PseudoType type = $$->pseudoType(); |
- if (type != CSSSelector::PseudoHostContext) |
- YYERROR; |
- } |
- | ':' HOSTCONTEXTFUNCTION selector_recovery closing_parenthesis { |
- YYERROR; |
- } |
- ; |
- |
-selector_recovery: |
- error error_location error_recovery; |
- |
-declaration_list: |
- /* empty */ { $$ = false; } |
- | declaration |
- | decl_list declaration { |
- $$ = $1 || $2; |
- } |
- | decl_list |
- ; |
- |
-decl_list: |
- declaration ';' maybe_space { |
- parser->startProperty(); |
- $$ = $1; |
- } |
- | decl_list declaration ';' maybe_space { |
- parser->startProperty(); |
- $$ = $1 || $2; |
- } |
- ; |
- |
-declaration: |
- property ':' maybe_space error_location expr prio { |
- $$ = false; |
- bool isPropertyParsed = false; |
- if ($1 != CSSPropertyInvalid) { |
- parser->m_valueList = parser->sinkFloatingValueList($5); |
- int oldParsedProperties = parser->m_parsedProperties.size(); |
- $$ = parser->parseValue($1, $6); |
- if (!$$) { |
- parser->rollbackLastProperties(parser->m_parsedProperties.size() - oldParsedProperties); |
- parser->reportError($4, InvalidPropertyValueCSSError); |
- } else |
- isPropertyParsed = true; |
- parser->m_valueList = nullptr; |
- } |
- parser->endProperty($6, isPropertyParsed); |
- } |
- | |
- property ':' maybe_space error_location expr prio error error_recovery { |
- /* When we encounter something like p {color: red !important fail;} we should drop the declaration */ |
- parser->reportError($4, InvalidPropertyValueCSSError); |
- parser->endProperty(false, false); |
- $$ = false; |
- } |
- | |
- property ':' maybe_space error_location error error_recovery { |
- parser->reportError($4, InvalidPropertyValueCSSError); |
- parser->endProperty(false, false); |
- $$ = false; |
- } |
- | |
- property error error_location error_recovery { |
- parser->reportError($3, PropertyDeclarationCSSError); |
- parser->endProperty(false, false, GeneralCSSError); |
- $$ = false; |
- } |
- | |
- error error_location error_recovery { |
- parser->reportError($2, PropertyDeclarationCSSError); |
- $$ = false; |
- } |
- ; |
- |
-property: |
- error_location IDENT maybe_space { |
- $$ = cssPropertyID($2); |
- parser->setCurrentProperty($$); |
- if ($$ == CSSPropertyInvalid) |
- parser->reportError($1, InvalidPropertyCSSError); |
- } |
- ; |
- |
-prio: |
- IMPORTANT_SYM maybe_space { $$ = true; } |
- | /* empty */ { $$ = false; } |
- ; |
- |
-ident_list: |
- IDENT maybe_space { |
- $$ = parser->createFloatingValueList(); |
- $$->addValue(makeIdentValue($1)); |
- } |
- | ident_list IDENT maybe_space { |
- $$ = $1; |
- $$->addValue(makeIdentValue($2)); |
- } |
- ; |
- |
-track_names_list: |
- '(' maybe_space closing_parenthesis { |
- $$.setFromValueList(parser->sinkFloatingValueList(parser->createFloatingValueList())); |
- } |
- | '(' maybe_space ident_list closing_parenthesis { |
- $$.setFromValueList(parser->sinkFloatingValueList($3)); |
- } |
- | '(' maybe_space expr_recovery closing_parenthesis { |
- YYERROR; |
- } |
- ; |
- |
-expr: |
- term { |
- $$ = parser->createFloatingValueList(); |
- $$->addValue(parser->sinkFloatingValue($1)); |
- } |
- | expr operator term { |
- $$ = $1; |
- $$->addValue(makeOperatorValue($2)); |
- $$->addValue(parser->sinkFloatingValue($3)); |
- } |
- | expr term { |
- $$ = $1; |
- $$->addValue(parser->sinkFloatingValue($2)); |
- } |
- ; |
- |
-expr_recovery: |
- error error_location error_recovery { |
- parser->reportError($2, PropertyDeclarationCSSError); |
- } |
- ; |
- |
-operator: |
- '/' maybe_space { |
- $$ = '/'; |
- } |
- | ',' maybe_space { |
- $$ = ','; |
- } |
- ; |
- |
-term: |
- unary_term maybe_space |
- | unary_operator unary_term maybe_space { $$ = $2; $$.fValue *= $1; } |
- | STRING maybe_space { $$.id = CSSValueInvalid; $$.isInt = false; $$.string = $1; $$.unit = CSSPrimitiveValue::CSS_STRING; } |
- | IDENT maybe_space { $$ = makeIdentValue($1); } |
- /* We might need to actually parse the number from a dimension, but we can't just put something that uses $$.string into unary_term. */ |
- | DIMEN maybe_space { $$.id = CSSValueInvalid; $$.string = $1; $$.isInt = false; $$.unit = CSSPrimitiveValue::CSS_DIMENSION; } |
- | unary_operator DIMEN maybe_space { $$.id = CSSValueInvalid; $$.string = $2; $$.isInt = false; $$.unit = CSSPrimitiveValue::CSS_DIMENSION; } |
- | URI maybe_space { $$.id = CSSValueInvalid; $$.string = $1; $$.isInt = false; $$.unit = CSSPrimitiveValue::CSS_URI; } |
- | UNICODERANGE maybe_space { $$.id = CSSValueInvalid; $$.string = $1; $$.isInt = false; $$.unit = CSSPrimitiveValue::CSS_UNICODE_RANGE; } |
- | HEX maybe_space { $$.id = CSSValueInvalid; $$.string = $1; $$.isInt = false; $$.unit = CSSPrimitiveValue::CSS_PARSER_HEXCOLOR; } |
- | '#' maybe_space { $$.id = CSSValueInvalid; $$.string = CSSParserString(); $$.isInt = false; $$.unit = CSSPrimitiveValue::CSS_PARSER_HEXCOLOR; } /* Handle error case: "color: #;" */ |
- /* FIXME: according to the specs a function can have a unary_operator in front. I know no case where this makes sense */ |
- | function maybe_space |
- | calc_function maybe_space |
- | '%' maybe_space { /* Handle width: %; */ |
- $$.id = CSSValueInvalid; $$.isInt = false; $$.unit = 0; |
- } |
- | track_names_list maybe_space |
- ; |
- |
-unary_term: |
- INTEGER { $$.setFromNumber($1); $$.isInt = true; } |
- | FLOATTOKEN { $$.setFromNumber($1); } |
- | PERCENTAGE { $$.setFromNumber($1, CSSPrimitiveValue::CSS_PERCENTAGE); } |
- | PXS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_PX); } |
- | CMS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_CM); } |
- | MMS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_MM); } |
- | INS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_IN); } |
- | PTS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_PT); } |
- | PCS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_PC); } |
- | DEGS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_DEG); } |
- | RADS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_RAD); } |
- | GRADS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_GRAD); } |
- | TURNS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_TURN); } |
- | MSECS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_MS); } |
- | SECS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_S); } |
- | HERTZ { $$.setFromNumber($1, CSSPrimitiveValue::CSS_HZ); } |
- | KHERTZ { $$.setFromNumber($1, CSSPrimitiveValue::CSS_KHZ); } |
- | EMS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_EMS); } |
- | QEMS { $$.setFromNumber($1, CSSParserValue::Q_EMS); } |
- | EXS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_EXS); } |
- | REMS { |
- $$.setFromNumber($1, CSSPrimitiveValue::CSS_REMS); |
- if (parser->m_styleSheet) |
- parser->m_styleSheet->parserSetUsesRemUnits(true); |
- } |
- | CHS { $$.setFromNumber($1, CSSPrimitiveValue::CSS_CHS); } |
- | VW { $$.setFromNumber($1, CSSPrimitiveValue::CSS_VW); } |
- | VH { $$.setFromNumber($1, CSSPrimitiveValue::CSS_VH); } |
- | VMIN { $$.setFromNumber($1, CSSPrimitiveValue::CSS_VMIN); } |
- | VMAX { $$.setFromNumber($1, CSSPrimitiveValue::CSS_VMAX); } |
- | DPPX { $$.setFromNumber($1, CSSPrimitiveValue::CSS_DPPX); } |
- | DPI { $$.setFromNumber($1, CSSPrimitiveValue::CSS_DPI); } |
- | DPCM { $$.setFromNumber($1, CSSPrimitiveValue::CSS_DPCM); } |
- | FR { $$.setFromNumber($1, CSSPrimitiveValue::CSS_FR); } |
- ; |
- |
-function: |
- FUNCTION maybe_space expr closing_parenthesis { |
- $$.setFromFunction(parser->createFloatingFunction($1, parser->sinkFloatingValueList($3))); |
- } | |
- FUNCTION maybe_space closing_parenthesis { |
- $$.setFromFunction(parser->createFloatingFunction($1, parser->sinkFloatingValueList(parser->createFloatingValueList()))); |
- } | |
- FUNCTION maybe_space expr_recovery closing_parenthesis { |
- YYERROR; |
- } |
- ; |
- |
-calc_func_term: |
- unary_term |
- | unary_operator unary_term { $$ = $2; $$.fValue *= $1; } |
- ; |
- |
-calc_func_operator: |
- space '+' space { |
- $$ = '+'; |
- } |
- | space '-' space { |
- $$ = '-'; |
- } |
- | calc_maybe_space '*' maybe_space { |
- $$ = '*'; |
- } |
- | calc_maybe_space '/' maybe_space { |
- $$ = '/'; |
- } |
- ; |
- |
-calc_maybe_space: |
- /* empty */ |
- | WHITESPACE |
- ; |
- |
-calc_func_paren_expr: |
- '(' maybe_space calc_func_expr calc_maybe_space closing_parenthesis { |
- $$ = $3; |
- $$->insertValueAt(0, makeOperatorValue('(')); |
- $$->addValue(makeOperatorValue(')')); |
- } |
- | '(' maybe_space expr_recovery closing_parenthesis { |
- YYERROR; |
- } |
- ; |
- |
-calc_func_expr: |
- calc_func_term { |
- $$ = parser->createFloatingValueList(); |
- $$->addValue(parser->sinkFloatingValue($1)); |
- } |
- | calc_func_expr calc_func_operator calc_func_term { |
- $$ = $1; |
- $$->addValue(makeOperatorValue($2)); |
- $$->addValue(parser->sinkFloatingValue($3)); |
- } |
- | calc_func_expr calc_func_operator calc_func_paren_expr { |
- $$ = $1; |
- $$->addValue(makeOperatorValue($2)); |
- $$->stealValues(*($3)); |
- } |
- | calc_func_paren_expr |
- ; |
- |
-calc_function: |
- CALCFUNCTION maybe_space calc_func_expr calc_maybe_space closing_parenthesis { |
- $$.setFromFunction(parser->createFloatingFunction($1, parser->sinkFloatingValueList($3))); |
- } |
- | CALCFUNCTION maybe_space expr_recovery closing_parenthesis { |
- YYERROR; |
- } |
- ; |
- |
- |
-invalid_at: |
- ATKEYWORD |
- | margin_sym |
- ; |
- |
-at_rule_recovery: |
- at_rule_header_recovery at_invalid_rule_header_end at_rule_end |
- ; |
- |
-at_rule_header_recovery: |
- error error_location rule_error_recovery { |
- parser->reportError($2, InvalidRuleCSSError); |
- } |
- ; |
- |
-at_rule_end: |
- at_invalid_rule_header_end semi_or_eof |
- | at_invalid_rule_header_end invalid_block |
- ; |
- |
-regular_invalid_at_rule_header: |
- keyframes_rule_start at_rule_header_recovery |
- | before_page_rule PAGE_SYM at_rule_header_recovery |
- | before_font_face_rule FONT_FACE_SYM at_rule_header_recovery |
- | before_supports_rule SUPPORTS_SYM error error_location rule_error_recovery { |
- parser->reportError($4, InvalidSupportsConditionCSSError); |
- parser->popSupportsRuleData(); |
- } |
- | before_viewport_rule VIEWPORT_RULE_SYM at_rule_header_recovery { |
- parser->markViewportRuleBodyEnd(); |
- } |
- | import_rule_start at_rule_header_recovery |
- | NAMESPACE_SYM at_rule_header_recovery |
- | error_location invalid_at at_rule_header_recovery { |
- parser->resumeErrorLogging(); |
- parser->reportError($1, InvalidRuleCSSError); |
- } |
- ; |
- |
-invalid_rule: |
- error error_location rule_error_recovery at_invalid_rule_header_end invalid_block { |
- parser->reportError($2, InvalidRuleCSSError); |
- } |
- | regular_invalid_at_rule_header at_invalid_rule_header_end ';' |
- | regular_invalid_at_rule_header at_invalid_rule_header_end invalid_block |
- | media_rule_start maybe_media_list ';' |
- ; |
- |
-invalid_rule_header: |
- error error_location rule_error_recovery at_invalid_rule_header_end { |
- parser->reportError($2, InvalidRuleCSSError); |
- } |
- | regular_invalid_at_rule_header at_invalid_rule_header_end |
- | media_rule_start maybe_media_list |
- ; |
- |
-at_invalid_rule_header_end: |
- /* empty */ { |
- parser->endInvalidRuleHeader(); |
- } |
- ; |
- |
-invalid_block: |
- '{' error_recovery closing_brace { |
- parser->invalidBlockHit(); |
- } |
- ; |
- |
-invalid_square_brackets_block: |
- '[' error_recovery closing_square_bracket |
- ; |
- |
-invalid_parentheses_block: |
- opening_parenthesis error_recovery closing_parenthesis; |
- |
-opening_parenthesis: |
- '(' | FUNCTION | CALCFUNCTION | ANYFUNCTION | NOTFUNCTION | CUEFUNCTION | DISTRIBUTEDFUNCTION | HOSTFUNCTION |
- ; |
- |
-error_location: { |
- $$ = parser->currentLocation(); |
- } |
- ; |
- |
-location_label: { |
- parser->setLocationLabel(parser->currentLocation()); |
- } |
- ; |
- |
-error_recovery: |
- /* empty */ |
- | error_recovery error |
- | error_recovery invalid_block |
- | error_recovery invalid_square_brackets_block |
- | error_recovery invalid_parentheses_block |
- ; |
- |
-rule_error_recovery: |
- /* empty */ |
- | rule_error_recovery error |
- | rule_error_recovery invalid_square_brackets_block |
- | rule_error_recovery invalid_parentheses_block |
- ; |
- |
-%% |