diff --git a/src/lib.rs b/src/lib.rs index a4a9db8..cdecd37 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -326,7 +326,10 @@ pub(crate) fn eat_expr>( } } '@' => { - toks.next(); + let span = toks.next().unwrap().pos(); + if toks.peek().is_none() { + return Err(("Expected identifier.", span).into()); + } let Spanned { node: ident, span } = eat_ident(toks, scope, super_selector)?; devour_whitespace(toks); let rule = AtRule::from_tokens( diff --git a/src/value/parse.rs b/src/value/parse.rs index 1ced72d..eadfff0 100644 --- a/src/value/parse.rs +++ b/src/value/parse.rs @@ -885,8 +885,10 @@ impl Value { } } ';' | '}' | '{' => return None, - ':' | '?' | ')' | '@' => return Some(Err(("expected \";\".", span).into())), - v if v.is_control() => return Some(Err(("Expected expression.", span).into())), + ':' | '?' | ')' | '@' | '^' => return Some(Err(("expected \";\".", span).into())), + v if v as u32 >= 0x80 || v.is_control() => { + return Some(Err(("Expected expression.", span).into())) + } v => todo!("unexpected token in value parsing: {:?}", v), })) } diff --git a/tests/error.rs b/tests/error.rs index ac25f26..011b9aa 100644 --- a/tests/error.rs +++ b/tests/error.rs @@ -57,3 +57,8 @@ error!( no_value_after_forward_slash, "a {color: 303/;}", "Error: Expected expression." ); +error!(xor_in_value, "a {color: a^;}", "Error: expected \";\"."); +error!( + nothing_after_at_sign, + "a {color: red; @", "Error: Expected identifier." +);