Index: Source/core/css/CSSGrammar.y.in |
diff --git a/Source/core/css/CSSGrammar.y.in b/Source/core/css/CSSGrammar.y.in |
index 0629bb64b08650a9c28ea9a7cd66f8d84866b2c3..9cef7b694cddacacc0cb63f04a550d5146497ce2 100644 |
--- a/Source/core/css/CSSGrammar.y.in |
+++ b/Source/core/css/CSSGrammar.y.in |
@@ -300,12 +300,14 @@ static inline bool isCSSTokenAString(int yytype) |
%type <character> operator |
%type <valueList> expr |
+%type <valueList> valid_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> valid_calc_func_expr |
%type <valueList> calc_func_expr_list |
%type <valueList> calc_func_paren_expr |
%type <value> calc_function |
@@ -1618,11 +1620,16 @@ prio: |
; |
expr: |
+ valid_expr |
+ | valid_expr expr_recovery { $$ = 0; } |
+ ; |
+ |
+valid_expr: |
term { |
$$ = parser->createFloatingValueList(); |
$$->addValue(parser->sinkFloatingValue($1)); |
} |
- | expr operator term { |
+ | valid_expr operator term { |
$$ = $1; |
if ($$) { |
if ($2) { |
@@ -1635,9 +1642,6 @@ expr: |
$$->addValue(parser->sinkFloatingValue($3)); |
} |
} |
- | expr expr_recovery { |
- $$ = 0; |
- } |
; |
expr_recovery: |
@@ -1806,6 +1810,11 @@ calc_func_paren_expr: |
; |
calc_func_expr: |
+ valid_calc_func_expr |
+ | valid_calc_func_expr expr_recovery { $$ = 0; } |
+ ; |
+ |
+valid_calc_func_expr: |
calc_func_term { |
$$ = parser->createFloatingValueList(); |
$$->addValue(parser->sinkFloatingValue($1)); |
@@ -1836,9 +1845,6 @@ calc_func_expr: |
$$ = 0; |
} |
| calc_func_paren_expr |
- | calc_func_expr error { |
- $$ = 0; |
- } |
; |
calc_func_expr_list: |
@@ -1956,8 +1962,18 @@ error_location: { |
error_recovery: |
/* empty */ |
- | error_recovery invalid_block |
| error_recovery error |
+ | error_recovery '{' error_recovery closing_brace { parser->invalidBlockHit(); } |
+ | error_recovery '[' error_recovery ']' |
+ | error_recovery '[' error_recovery TOKEN_EOF |
+ | error_recovery '(' error_recovery closing_parenthesis |
+ | error_recovery FUNCTION error_recovery closing_parenthesis |
+ | error_recovery CALCFUNCTION error_recovery closing_parenthesis |
+ | error_recovery VARFUNCTION error_recovery closing_parenthesis |
+ | error_recovery MINFUNCTION error_recovery closing_parenthesis |
+ | error_recovery MAXFUNCTION error_recovery closing_parenthesis |
+ | error_recovery ANYFUNCTION error_recovery closing_parenthesis |
+ | error_recovery NOTFUNCTION error_recovery closing_parenthesis |
; |
%% |