diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index bcaf9d9..13b699f 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -307,11 +307,7 @@ top_level = { // ====================================================== block = { - "{" ~ statement_list ~ "}" -} - -statement_list = { - (statement | unexpected_statement)* + "{" ~ (statement | unexpected_statement)* ~ "}" } statement = _{ diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index c4e22e4..3f5afd5 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -9,9 +9,19 @@ impl<'a> TryFrom> for Block { type Error = AstError<'a, Self>; fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result { - Ok(Block( - collect_recovered(pair.into_inner().next().unwrap().into_inner()).get()?, - )) + if pair.as_rule() == Rule::block { + Ok(Block(collect_recovered(pair.into_inner()).get()?)) + } else { + Err(AstError { + span: pair.as_span(), + error_code: ErrorCode::InvalidStatement, + error_message: format!( + "BUG: AST requires a block, this isn't a block, it's a {:?}", + pair.as_rule() + ), + recovered: None, + }) + } } } @@ -29,7 +39,7 @@ impl<'a> TryFrom> for Statement { Statement::Expression(Expression::try_from(inner.next().unwrap()).get()?) } - Rule::block => Statement::Block(Block::try_from(inner.next().unwrap()).get()?), + Rule::block => Statement::Block(pair.try_into().get()?), Rule::var_decl_statement => Statement::VarDecl(VarDeclStmt::try_from(pair).get()?),