⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cssgrammar.y

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 Y
📖 第 1 页 / 共 3 页
字号:
    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 = &star; $$.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 = &star;        $$.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 + -