Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: Source/core/css/CSSGrammar.y.in

Issue 14897004: Skipping {}, () and [] blocks while error recovering in CSS. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2002-2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2002-2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 App le Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 App le Inc. All rights reserved.
4 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
6 * Copyright (C) 2012 Intel Corporation. All rights reserved. 6 * Copyright (C) 2012 Intel Corporation. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public 9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 case VAR_DEFINITION: 80 case VAR_DEFINITION:
81 case UNICODERANGE: 81 case UNICODERANGE:
82 return true; 82 return true;
83 default: 83 default:
84 return false; 84 return false;
85 } 85 }
86 } 86 }
87 87
88 %} 88 %}
89 89
90 %expect 33 90 %expect 32
91 91
92 %nonassoc LOWEST_PREC 92 %nonassoc LOWEST_PREC
93 93
94 %left UNIMPORTANT_TOK 94 %left UNIMPORTANT_TOK
95 95
96 %token WHITESPACE SGML_CD 96 %token WHITESPACE SGML_CD
97 %token TOKEN_EOF 0 97 %token TOKEN_EOF 0
98 98
99 %token INCLUDES 99 %token INCLUDES
100 %token DASHMATCH 100 %token DASHMATCH
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 %type <boolean> declarations_and_margins 293 %type <boolean> declarations_and_margins
294 294
295 %type <boolean> prio 295 %type <boolean> prio
296 296
297 %type <integer> match 297 %type <integer> match
298 %type <integer> unary_operator 298 %type <integer> unary_operator
299 %type <integer> maybe_unary_operator 299 %type <integer> maybe_unary_operator
300 %type <character> operator 300 %type <character> operator
301 301
302 %type <valueList> expr 302 %type <valueList> expr
303 %type <valueList> valid_expr
303 %type <value> term 304 %type <value> term
304 %type <value> unary_term 305 %type <value> unary_term
305 %type <value> function 306 %type <value> function
306 %type <value> calc_func_term 307 %type <value> calc_func_term
307 %type <character> calc_func_operator 308 %type <character> calc_func_operator
308 %type <valueList> calc_func_expr 309 %type <valueList> calc_func_expr
310 %type <valueList> valid_calc_func_expr
309 %type <valueList> calc_func_expr_list 311 %type <valueList> calc_func_expr_list
310 %type <valueList> calc_func_paren_expr 312 %type <valueList> calc_func_paren_expr
311 %type <value> calc_function 313 %type <value> calc_function
312 %type <string> min_or_max 314 %type <string> min_or_max
313 %type <value> min_or_max_function 315 %type <value> min_or_max_function
314 316
315 %type <string> element_name 317 %type <string> element_name
316 %type <string> attr_name 318 %type <string> attr_name
317 319
318 %type <location> error_location 320 %type <location> error_location
(...skipping 1292 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 $$ = cssPropertyID($1); 1613 $$ = cssPropertyID($1);
1612 } 1614 }
1613 ; 1615 ;
1614 1616
1615 prio: 1617 prio:
1616 IMPORTANT_SYM maybe_space { $$ = true; } 1618 IMPORTANT_SYM maybe_space { $$ = true; }
1617 | /* empty */ { $$ = false; } 1619 | /* empty */ { $$ = false; }
1618 ; 1620 ;
1619 1621
1620 expr: 1622 expr:
1623 valid_expr
1624 | valid_expr expr_recovery { $$ = 0; }
1625 ;
1626
1627 valid_expr:
1621 term { 1628 term {
1622 $$ = parser->createFloatingValueList(); 1629 $$ = parser->createFloatingValueList();
1623 $$->addValue(parser->sinkFloatingValue($1)); 1630 $$->addValue(parser->sinkFloatingValue($1));
1624 } 1631 }
1625 | expr operator term { 1632 | valid_expr operator term {
1626 $$ = $1; 1633 $$ = $1;
1627 if ($$) { 1634 if ($$) {
1628 if ($2) { 1635 if ($2) {
1629 CSSParserValue v; 1636 CSSParserValue v;
1630 v.id = 0; 1637 v.id = 0;
1631 v.unit = CSSParserValue::Operator; 1638 v.unit = CSSParserValue::Operator;
1632 v.iValue = $2; 1639 v.iValue = $2;
1633 $$->addValue(v); 1640 $$->addValue(v);
1634 } 1641 }
1635 $$->addValue(parser->sinkFloatingValue($3)); 1642 $$->addValue(parser->sinkFloatingValue($3));
1636 } 1643 }
1637 } 1644 }
1638 | expr expr_recovery {
1639 $$ = 0;
1640 }
1641 ; 1645 ;
1642 1646
1643 expr_recovery: 1647 expr_recovery:
1644 error error_location error_recovery 1648 error error_location error_recovery
1645 ; 1649 ;
1646 1650
1647 operator: 1651 operator:
1648 '/' maybe_space { 1652 '/' maybe_space {
1649 $$ = '/'; 1653 $$ = '/';
1650 } 1654 }
(...skipping 20 matching lines...) Expand all
1671 | URI maybe_space { $$.id = 0; $$.string = $1; $$.unit = CSSPrimitiveValue::CS S_URI; } 1675 | URI maybe_space { $$.id = 0; $$.string = $1; $$.unit = CSSPrimitiveValue::CS S_URI; }
1672 | UNICODERANGE maybe_space { $$.id = 0; $$.string = $1; $$.unit = CSSPrimitive Value::CSS_UNICODE_RANGE; } 1676 | UNICODERANGE maybe_space { $$.id = 0; $$.string = $1; $$.unit = CSSPrimitive Value::CSS_UNICODE_RANGE; }
1673 | HEX maybe_space { $$.id = 0; $$.string = $1; $$.unit = CSSPrimitiveValue::CS S_PARSER_HEXCOLOR; } 1677 | HEX maybe_space { $$.id = 0; $$.string = $1; $$.unit = CSSPrimitiveValue::CS S_PARSER_HEXCOLOR; }
1674 | '#' maybe_space { $$.id = 0; $$.string = CSSParserString(); $$.unit = CSSPri mitiveValue::CSS_PARSER_HEXCOLOR; } /* Handle error case: "color: #;" */ 1678 | '#' maybe_space { $$.id = 0; $$.string = CSSParserString(); $$.unit = CSSPri mitiveValue::CSS_PARSER_HEXCOLOR; } /* Handle error case: "color: #;" */
1675 | VARFUNCTION maybe_space IDENT ')' maybe_space { 1679 | VARFUNCTION maybe_space IDENT ')' maybe_space {
1676 $$.id = 0; 1680 $$.id = 0;
1677 $$.string = $3; 1681 $$.string = $3;
1678 $$.unit = CSSPrimitiveValue::CSS_VARIABLE_NAME; 1682 $$.unit = CSSPrimitiveValue::CSS_VARIABLE_NAME;
1679 } 1683 }
1680 /* FIXME: according to the specs a function can have a unary_operator in front . I know no case where this makes sense */ 1684 /* FIXME: according to the specs a function can have a unary_operator in front . I know no case where this makes sense */
1681 | function { 1685 | function maybe_space {
1682 $$ = $1; 1686 $$ = $1;
1683 } 1687 }
1684 | calc_function { 1688 | calc_function maybe_space {
1685 $$ = $1; 1689 $$ = $1;
1686 } 1690 }
1687 | min_or_max_function { 1691 | min_or_max_function maybe_space {
1688 $$ = $1; 1692 $$ = $1;
1689 } 1693 }
1690 | '%' maybe_space { /* Handle width: %; */ 1694 | '%' maybe_space { /* Handle width: %; */
1691 $$.id = 0; $$.unit = 0; 1695 $$.id = 0; $$.unit = 0;
1692 } 1696 }
1693 ; 1697 ;
1694 1698
1695 unary_term: 1699 unary_term:
1696 INTEGER { $$.id = 0; $$.isInt = true; $$.fValue = $1; $$.unit = CSSPrimitiveVa lue::CSS_NUMBER; } 1700 INTEGER { $$.id = 0; $$.isInt = true; $$.fValue = $1; $$.unit = CSSPrimitiveVa lue::CSS_NUMBER; }
1697 | FLOATTOKEN { $$.id = 0; $$.isInt = false; $$.fValue = $1; $$.unit = CSSPrimi tiveValue::CSS_NUMBER; } 1701 | FLOATTOKEN { $$.id = 0; $$.isInt = false; $$.fValue = $1; $$.unit = CSSPrimi tiveValue::CSS_NUMBER; }
(...skipping 27 matching lines...) Expand all
1725 | VH { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_VH; } 1729 | VH { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_VH; }
1726 | VMIN { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_VMIN; } 1730 | VMIN { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_VMIN; }
1727 | VMAX { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_VMAX; } 1731 | VMAX { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_VMAX; }
1728 | DPPX { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_DPPX; } 1732 | DPPX { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_DPPX; }
1729 | DPI { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_DPI; } 1733 | DPI { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_DPI; }
1730 | DPCM { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_DPCM; } 1734 | DPCM { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_DPCM; }
1731 | FR { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_FR; } 1735 | FR { $$.id = 0; $$.fValue = $1; $$.unit = CSSPrimitiveValue::CSS_FR; }
1732 ; 1736 ;
1733 1737
1734 function: 1738 function:
1735 FUNCTION maybe_space expr closing_parenthesis maybe_space { 1739 FUNCTION maybe_space expr closing_parenthesis {
1736 CSSParserFunction* f = parser->createFloatingFunction(); 1740 CSSParserFunction* f = parser->createFloatingFunction();
1737 f->name = $1; 1741 f->name = $1;
1738 f->args = parser->sinkFloatingValueList($3); 1742 f->args = parser->sinkFloatingValueList($3);
1739 $$.id = 0; 1743 $$.id = 0;
1740 $$.unit = CSSParserValue::Function; 1744 $$.unit = CSSParserValue::Function;
1741 $$.function = f; 1745 $$.function = f;
1742 } | 1746 } |
1743 FUNCTION maybe_space closing_parenthesis maybe_space { 1747 FUNCTION maybe_space closing_parenthesis {
1744 CSSParserFunction* f = parser->createFloatingFunction(); 1748 CSSParserFunction* f = parser->createFloatingFunction();
1745 f->name = $1; 1749 f->name = $1;
1746 CSSParserValueList* valueList = parser->createFloatingValueList(); 1750 CSSParserValueList* valueList = parser->createFloatingValueList();
1747 f->args = parser->sinkFloatingValueList(valueList); 1751 f->args = parser->sinkFloatingValueList(valueList);
1748 $$.id = 0; 1752 $$.id = 0;
1749 $$.unit = CSSParserValue::Function; 1753 $$.unit = CSSParserValue::Function;
1750 $$.function = f; 1754 $$.function = f;
1751 } | 1755 } |
1752 FUNCTION maybe_space error { 1756 FUNCTION maybe_space expr_recovery closing_parenthesis {
1753 CSSParserFunction* f = parser->createFloatingFunction(); 1757 CSSParserFunction* f = parser->createFloatingFunction();
1754 f->name = $1; 1758 f->name = $1;
1755 f->args = nullptr; 1759 f->args = nullptr;
1756 $$.id = 0; 1760 $$.id = 0;
1757 $$.unit = CSSParserValue::Function; 1761 $$.unit = CSSParserValue::Function;
1758 $$.function = f; 1762 $$.function = f;
1759 } 1763 }
1760 ; 1764 ;
1761 1765
1762 calc_func_term: 1766 calc_func_term:
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1799 v.iValue = '('; 1803 v.iValue = '(';
1800 $$->insertValueAt(0, v); 1804 $$->insertValueAt(0, v);
1801 v.iValue = ')'; 1805 v.iValue = ')';
1802 $$->addValue(v); 1806 $$->addValue(v);
1803 } else 1807 } else
1804 $$ = 0; 1808 $$ = 0;
1805 } 1809 }
1806 ; 1810 ;
1807 1811
1808 calc_func_expr: 1812 calc_func_expr:
1813 valid_calc_func_expr
1814 | valid_calc_func_expr expr_recovery { $$ = 0; }
1815 ;
1816
1817 valid_calc_func_expr:
1809 calc_func_term { 1818 calc_func_term {
1810 $$ = parser->createFloatingValueList(); 1819 $$ = parser->createFloatingValueList();
1811 $$->addValue(parser->sinkFloatingValue($1)); 1820 $$->addValue(parser->sinkFloatingValue($1));
1812 } 1821 }
1813 | calc_func_expr calc_func_operator calc_func_term { 1822 | calc_func_expr calc_func_operator calc_func_term {
1814 if ($1 && $2) { 1823 if ($1 && $2) {
1815 $$ = $1; 1824 $$ = $1;
1816 CSSParserValue v; 1825 CSSParserValue v;
1817 v.id = 0; 1826 v.id = 0;
1818 v.unit = CSSParserValue::Operator; 1827 v.unit = CSSParserValue::Operator;
(...skipping 10 matching lines...) Expand all
1829 CSSParserValue v; 1838 CSSParserValue v;
1830 v.id = 0; 1839 v.id = 0;
1831 v.unit = CSSParserValue::Operator; 1840 v.unit = CSSParserValue::Operator;
1832 v.iValue = $2; 1841 v.iValue = $2;
1833 $$->addValue(v); 1842 $$->addValue(v);
1834 $$->extend(*($3)); 1843 $$->extend(*($3));
1835 } else 1844 } else
1836 $$ = 0; 1845 $$ = 0;
1837 } 1846 }
1838 | calc_func_paren_expr 1847 | calc_func_paren_expr
1839 | calc_func_expr error {
1840 $$ = 0;
1841 }
1842 ; 1848 ;
1843 1849
1844 calc_func_expr_list: 1850 calc_func_expr_list:
1845 calc_func_expr calc_maybe_space { 1851 calc_func_expr calc_maybe_space {
1846 $$ = $1; 1852 $$ = $1;
1847 } 1853 }
1848 | calc_func_expr_list ',' maybe_space calc_func_expr calc_maybe_space { 1854 | calc_func_expr_list ',' maybe_space calc_func_expr calc_maybe_space {
1849 if ($1 && $4) { 1855 if ($1 && $4) {
1850 $$ = $1; 1856 $$ = $1;
1851 CSSParserValue v; 1857 CSSParserValue v;
1852 v.id = 0; 1858 v.id = 0;
1853 v.unit = CSSParserValue::Operator; 1859 v.unit = CSSParserValue::Operator;
1854 v.iValue = ','; 1860 v.iValue = ',';
1855 $$->addValue(v); 1861 $$->addValue(v);
1856 $$->extend(*($4)); 1862 $$->extend(*($4));
1857 } else 1863 } else
1858 $$ = 0; 1864 $$ = 0;
1859 } 1865 }
1860 ; 1866 ;
1861 1867
1862 calc_function: 1868 calc_function:
1863 CALCFUNCTION maybe_space calc_func_expr calc_maybe_space ')' maybe_space { 1869 CALCFUNCTION maybe_space calc_func_expr calc_maybe_space ')' {
1864 CSSParserFunction* f = parser->createFloatingFunction(); 1870 CSSParserFunction* f = parser->createFloatingFunction();
1865 f->name = $1; 1871 f->name = $1;
1866 f->args = parser->sinkFloatingValueList($3); 1872 f->args = parser->sinkFloatingValueList($3);
1867 $$.id = 0; 1873 $$.id = 0;
1868 $$.unit = CSSParserValue::Function; 1874 $$.unit = CSSParserValue::Function;
1869 $$.function = f; 1875 $$.function = f;
1870 } 1876 }
1871 | CALCFUNCTION maybe_space error { 1877 | CALCFUNCTION maybe_space expr_recovery closing_parenthesis {
1872 YYERROR; 1878 YYERROR;
1873 } 1879 }
1874 ; 1880 ;
1875 1881
1876 1882
1877 min_or_max: 1883 min_or_max:
1878 MINFUNCTION { 1884 MINFUNCTION {
1879 $$ = $1; 1885 $$ = $1;
1880 } 1886 }
1881 | MAXFUNCTION { 1887 | MAXFUNCTION {
1882 $$ = $1; 1888 $$ = $1;
1883 } 1889 }
1884 ; 1890 ;
1885 1891
1886 min_or_max_function: 1892 min_or_max_function:
1887 min_or_max maybe_space calc_func_expr_list ')' maybe_space { 1893 min_or_max maybe_space calc_func_expr_list ')' {
1888 CSSParserFunction* f = parser->createFloatingFunction(); 1894 CSSParserFunction* f = parser->createFloatingFunction();
1889 f->name = $1; 1895 f->name = $1;
1890 f->args = parser->sinkFloatingValueList($3); 1896 f->args = parser->sinkFloatingValueList($3);
1891 $$.id = 0; 1897 $$.id = 0;
1892 $$.unit = CSSParserValue::Function; 1898 $$.unit = CSSParserValue::Function;
1893 $$.function = f; 1899 $$.function = f;
1894 } 1900 }
1895 | min_or_max maybe_space error { 1901 | min_or_max maybe_space expr_recovery closing_parenthesis {
1896 YYERROR; 1902 YYERROR;
1897 } 1903 }
1898 ; 1904 ;
1899 1905
1900 /* error handling rules */ 1906 /* error handling rules */
1901 1907
1902 save_block: 1908 save_block:
1903 closing_brace { 1909 closing_brace {
1904 $$ = 0; 1910 $$ = 0;
1905 } 1911 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 | invalid_block_list error invalid_block 1955 | invalid_block_list error invalid_block
1950 ; 1956 ;
1951 1957
1952 error_location: { 1958 error_location: {
1953 $$ = parser->currentLocation(); 1959 $$ = parser->currentLocation();
1954 } 1960 }
1955 ; 1961 ;
1956 1962
1957 error_recovery: 1963 error_recovery:
1958 /* empty */ 1964 /* empty */
1959 | error_recovery invalid_block
1960 | error_recovery error 1965 | error_recovery error
1966 | error_recovery '{' error_recovery closing_brace { parser->invalidBlockHit(); }
1967 | error_recovery '[' error_recovery ']'
1968 | error_recovery '[' error_recovery TOKEN_EOF
1969 | error_recovery '(' error_recovery closing_parenthesis
1970 | error_recovery FUNCTION error_recovery closing_parenthesis
1971 | error_recovery CALCFUNCTION error_recovery closing_parenthesis
1972 | error_recovery VARFUNCTION error_recovery closing_parenthesis
1973 | error_recovery MINFUNCTION error_recovery closing_parenthesis
1974 | error_recovery MAXFUNCTION error_recovery closing_parenthesis
1975 | error_recovery ANYFUNCTION error_recovery closing_parenthesis
1976 | error_recovery NOTFUNCTION error_recovery closing_parenthesis
1961 ; 1977 ;
1962 1978
1963 %% 1979 %%
1964 1980
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698