diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 547e347..bcaf9d9 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -52,6 +52,14 @@ visibility = { "pub" ~ ("(" ~ static_path ~ ")")? } mutable = { "mut" } var = { "var" } +// ====================================================== +// ERROR RECOVERY +// ====================================================== + +unexpected_statement = { + (!(semicolon | "}" | statement) ~ ANY)+ +} + // ====================================================== // GENERICS // ====================================================== @@ -303,7 +311,7 @@ block = { } statement_list = { - statement* + (statement | unexpected_statement)* } statement = _{ diff --git a/parser/src/lib.rs b/parser/src/lib.rs index e536c67..d89ac1e 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -491,6 +491,12 @@ impl From> for Statement { .collect(), ), + Rule::unexpected_statement => { + let pos = pair.as_span().start_pos().line_col(); + + panic!("({}:{}) Invalid Statement: {}", pos.0, pos.1, pair.as_str()) + } + _ => unimplemented!("{rule:#?}"), } }