📄 cssgrammar.y
字号:
variables_declaration ';' maybe_space { $$ = $1; } | variables_declaration invalid_block_list ';' maybe_space { $$ = false; } | error ';' maybe_space { $$ = false; } | error invalid_block_list error ';' maybe_space { $$ = false; } | variables_decl_list variables_declaration ';' maybe_space { $$ = $1; if ($2) $$ = $2; } | variables_decl_list error ';' maybe_space { $$ = $1; } | variables_decl_list error invalid_block_list error ';' maybe_space { $$ = $1; } ;variables_declaration: variable_name ':' maybe_space expr { $$ = static_cast<CSSParser*>(parser)->addVariable($1, $4); } | variable_name maybe_space '{' maybe_space declaration_list '}' maybe_space { $$ = static_cast<CSSParser*>(parser)->addVariableDeclarationBlock($1); } | variable_name error { $$ = false; } | variable_name ':' maybe_space error expr { $$ = false; } | variable_name ':' maybe_space { /* @variables { varname: } Just reduce away this variable with no value. */ $$ = false; } | variable_name ':' maybe_space error { /* if we come across rules with invalid values like this case: @variables { varname: *; }, just discard the property/value pair */ $$ = false; } ;variable_name: IDENT maybe_space { $$ = $1; } ;namespace:NAMESPACE_SYM maybe_space maybe_ns_prefix string_or_uri maybe_space ';' { CSSParser* p = static_cast<CSSParser*>(parser); if (p->m_styleSheet) p->m_styleSheet->addNamespace(p, $3, $4);}| NAMESPACE_SYM error invalid_block| NAMESPACE_SYM error ';';maybe_ns_prefix:/* empty */ { $$.characters = 0; }| IDENT WHITESPACE { $$ = $1; };string_or_uri:STRING| URI;media_feature: IDENT maybe_space { $$ = $1; } ;maybe_media_value: /*empty*/ { $$ = 0; } | ':' maybe_space expr maybe_space { $$ = $3; } ;media_query_exp: '(' maybe_space media_feature maybe_space maybe_media_value ')' maybe_space { $3.lower(); $$ = static_cast<CSSParser*>(parser)->createFloatingMediaQueryExp($3, $5); } ;media_query_exp_list: media_query_exp { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingMediaQueryExpList(); $$->append(p->sinkFloatingMediaQueryExp($1)); } | media_query_exp_list maybe_space MEDIA_AND maybe_space media_query_exp { $$ = $1; $$->append(static_cast<CSSParser*>(parser)->sinkFloatingMediaQueryExp($5)); } ;maybe_and_media_query_exp_list: /*empty*/ { $$ = static_cast<CSSParser*>(parser)->createFloatingMediaQueryExpList(); } | MEDIA_AND maybe_space media_query_exp_list { $$ = $3; } ;maybe_media_restrictor: /*empty*/ { $$ = MediaQuery::None; } | MEDIA_ONLY { $$ = MediaQuery::Only; } | MEDIA_NOT { $$ = MediaQuery::Not; } ;media_query: media_query_exp_list { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingMediaQuery(p->sinkFloatingMediaQueryExpList($1)); } | maybe_media_restrictor maybe_space medium maybe_and_media_query_exp_list { CSSParser* p = static_cast<CSSParser*>(parser); $3.lower(); $$ = p->createFloatingMediaQuery($1, $3, p->sinkFloatingMediaQueryExpList($4)); } ;maybe_media_list: /* empty */ { $$ = static_cast<CSSParser*>(parser)->createMediaList(); } | media_list ;media_list: media_query { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createMediaList(); $$->appendMediaQuery(p->sinkFloatingMediaQuery($1)); } | media_list ',' maybe_space media_query { $$ = $1; if ($$) $$->appendMediaQuery(static_cast<CSSParser*>(parser)->sinkFloatingMediaQuery($4)); } | media_list error { $$ = 0; } ;media: MEDIA_SYM maybe_space media_list '{' maybe_space block_rule_list save_block { $$ = static_cast<CSSParser*>(parser)->createMediaRule($3, $6); } | MEDIA_SYM maybe_space '{' maybe_space block_rule_list save_block { $$ = static_cast<CSSParser*>(parser)->createMediaRule(0, $5); } ;medium: IDENT maybe_space { $$ = $1; } ;keyframes: WEBKIT_KEYFRAMES_SYM maybe_space keyframe_name maybe_space '{' maybe_space keyframes_rule '}' { $$ = $7; $7->setNameInternal($3); } ; keyframe_name: IDENT | STRING ;keyframes_rule: /* empty */ { $$ = static_cast<CSSParser*>(parser)->createKeyframesRule(); } | keyframes_rule keyframe_rule maybe_space { $$ = $1; if ($2) $$->append($2); } ;keyframe_rule: key_list maybe_space '{' maybe_space declaration_list '}' { $$ = static_cast<CSSParser*>(parser)->createKeyframeRule($1); } ;key_list: key { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingValueList(); $$->addValue(p->sinkFloatingValue($1)); } | key_list maybe_space ',' maybe_space key { CSSParser* p = static_cast<CSSParser*>(parser); $$ = $1; if ($$) $$->addValue(p->sinkFloatingValue($5)); } ;key: PERCENTAGE { $$.id = 0; $$.isInt = false; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_NUMBER; } | IDENT { $$.id = 0; $$.isInt = false; $$.unit = CSSPrimitiveValue::CSS_NUMBER; CSSParserString& str = $1; if (equalIgnoringCase(static_cast<const String&>(str), "from")) $$.fValue = 0; else if (equalIgnoringCase(static_cast<const String&>(str), "to")) $$.fValue = 100; else YYERROR; } ;/*page: PAGE_SYM maybe_space IDENT? pseudo_page? maybe_space '{' maybe_space declaration [ ';' maybe_space declaration ]* '}' maybe_space ;pseudo_page : ':' IDENT ;*/page: PAGE_SYM error invalid_block { $$ = 0; } | PAGE_SYM error ';' { $$ = 0; } ;font_face: FONT_FACE_SYM maybe_space '{' maybe_space declaration_list '}' maybe_space { $$ = static_cast<CSSParser*>(parser)->createFontFaceRule(); } | FONT_FACE_SYM error invalid_block { $$ = 0; } | FONT_FACE_SYM error ';' { $$ = 0; };combinator: '+' maybe_space { $$ = CSSSelector::DirectAdjacent; } | '~' maybe_space { $$ = CSSSelector::IndirectAdjacent; } | '>' maybe_space { $$ = CSSSelector::Child; } ;unary_operator: '-' { $$ = -1; } | '+' { $$ = 1; } ;ruleset: selector_list '{' maybe_space declaration_list closing_brace { $$ = static_cast<CSSParser*>(parser)->createStyleRule($1); } ;selector_list: selector %prec UNIMPORTANT_TOK { if ($1) { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->reusableSelectorVector(); deleteAllValues(*$$); $$->shrink(0); $$->append(p->sinkFloatingSelector($1)); } } | selector_list ',' maybe_space selector %prec UNIMPORTANT_TOK { if ($1 && $4) { CSSParser* p = static_cast<CSSParser*>(parser); $$ = $1; $$->append(p->sinkFloatingSelector($4)); } else $$ = 0; } | selector_list error { $$ = 0; } ;selector_with_trailing_whitespace: selector WHITESPACE { $$ = $1; } ;selector: simple_selector { $$ = $1; } | selector_with_trailing_whitespace { $$ = $1; } | selector_with_trailing_whitespace simple_selector { $$ = $2; if (!$1) $$ = 0; else if ($$) { CSSParser* p = static_cast<CSSParser*>(parser); CSSSelector* end = $$; while (end->tagHistory()) end = end->tagHistory(); end->m_relation = CSSSelector::Descendant; end->setTagHistory(p->sinkFloatingSelector($1)); if (Document* doc = p->document()) doc->setUsesDescendantRules(true); } } | selector combinator simple_selector { $$ = $3; if (!$1) $$ = 0; else if ($$) { CSSParser* p = static_cast<CSSParser*>(parser); CSSSelector* end = $$; while (end->tagHistory()) end = end->tagHistory(); end->m_relation = $2; end->setTagHistory(p->sinkFloatingSelector($1)); if ($2 == CSSSelector::Child) { if (Document* doc = p->document()) doc->setUsesDescendantRules(true); } else if ($2 == CSSSelector::DirectAdjacent || $2 == CSSSelector::IndirectAdjacent) { if (Document* doc = p->document()) doc->setUsesSiblingRules(true); } } } | selector error { $$ = 0; } ;namespace_selector: /* empty */ '|' { $$.characters = 0; $$.length = 0; } | '*' '|' { static UChar star = '*'; $$.characters = ☆ $$.length = 1; } | IDENT '|' { $$ = $1; }; simple_selector: element_name { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingSelector(); $$->m_tag = QualifiedName(nullAtom, $1, p->m_defaultNamespace); } | element_name specifier_list { $$ = $2; if ($$) { CSSParser* p = static_cast<CSSParser*>(parser); $$->m_tag = QualifiedName(nullAtom, $1, p->m_defaultNamespace); } } | specifier_list { $$ = $1; CSSParser* p = static_cast<CSSParser*>(parser); if ($$ && p->m_defaultNamespace != starAtom) $$->m_tag = QualifiedName(nullAtom, starAtom, p->m_defaultNamespace); } | namespace_selector element_name { AtomicString namespacePrefix = $1; CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingSelector(); if (p->m_styleSheet) $$->m_tag = QualifiedName(namespacePrefix, $2, p->m_styleSheet->determineNamespace(namespacePrefix)); else // FIXME: Shouldn't this case be an error? $$->m_tag = QualifiedName(nullAtom, $2, p->m_defaultNamespace); } | namespace_selector element_name specifier_list { $$ = $3; if ($$) { AtomicString namespacePrefix = $1; CSSParser* p = static_cast<CSSParser*>(parser); if (p->m_styleSheet) $$->m_tag = QualifiedName(namespacePrefix, $2, p->m_styleSheet->determineNamespace(namespacePrefix)); else // FIXME: Shouldn't this case be an error? $$->m_tag = QualifiedName(nullAtom, $2, p->m_defaultNamespace); } } | namespace_selector specifier_list { $$ = $2; if ($$) { AtomicString namespacePrefix = $1; CSSParser* p = static_cast<CSSParser*>(parser); if (p->m_styleSheet) $$->m_tag = QualifiedName(namespacePrefix, starAtom, p->m_styleSheet->determineNamespace(namespacePrefix)); } } ;element_name: IDENT { CSSParserString& str = $1; CSSParser* p = static_cast<CSSParser*>(parser); Document* doc = p->document(); if (doc && doc->isHTMLDocument()) str.lower(); $$ = str; } | '*' { static UChar star = '*'; $$.characters = ☆ $$.length = 1; } ;specifier_list: specifier { $$ = $1; } | specifier_list specifier { if (!$2) $$ = 0; else if ($1) { $$ = $1; CSSParser* p = static_cast<CSSParser*>(parser); CSSSelector* end = $1; while (end->tagHistory()) end = end->tagHistory(); end->m_relation = CSSSelector::SubSelector; end->setTagHistory(p->sinkFloatingSelector($2)); } } | specifier_list error { $$ = 0; };specifier: IDSEL { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingSelector(); $$->m_match = CSSSelector::Id; if (!p->m_strict) $1.lower(); $$->m_value = $1; } | HEX { if ($1.characters[0] >= '0' && $1.characters[0] <= '9') { $$ = 0; } else { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingSelector(); $$->m_match = CSSSelector::Id; if (!p->m_strict) $1.lower(); $$->m_value = $1; } } | class | attrib | pseudo ;class: '.' IDENT { CSSParser* p = static_cast<CSSParser*>(parser); $$ = p->createFloatingSelector(); $$->m_match = CSSSelector::Class; if (!p->m_strict) $2.lower(); $$->m_value = $2; } ;attr_name: IDENT maybe_space { CSSParserString& str = $1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -