diff --git a/src/parse/mod.rs b/src/parse/mod.rs index af85b49..79d4a33 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -755,20 +755,32 @@ fn tuple_to_let(t: (Token, Expression)) -> ParseResult { })) } -named!(let_statement, +named!(let_stmt_body, map_res!( do_parse!( - word!("let") >> name: match_type!(BAREWORD) >> punct!("=") >> val: expression >> punct!(";") >> - (name, val) - ), + (name, val)), tuple_to_let ) ); +named!(let_statement, + do_parse!( + word!("let") >> + pos: pos >> + stmt: add_return_error!( + nom::ErrorKind::Custom( + error::Error::new( + "Invalid syntax for let binding", + error::ErrorType::ParseError, pos)), + let_stmt_body) >> + (stmt) + ) +); + fn tuple_to_import(t: (Token, Token)) -> ParseResult { Ok(Statement::Import(ImportDef { path: t.0, @@ -776,20 +788,33 @@ fn tuple_to_import(t: (Token, Token)) -> ParseResult { })) } -named!(import_statement, +named!(import_stmt_body, map_res!( - do_parse!( - word!("import") >> - path: match_type!(STR) >> - word!("as") >> - name: match_type!(BAREWORD) >> - punct!(";") >> - (path, name) - ), + do_parse!( + path: match_type!(STR) >> + word!("as") >> + name: match_type!(BAREWORD) >> + punct!(";") >> + (path, name)), tuple_to_import ) ); +named!(import_statement, + do_parse!( + word!("import") >> + // past this point we know this is supposed to be an import statement. + pos: pos >> + stmt: add_return_error!( + nom::ErrorKind::Custom( + error::Error::new( + "Invalid syntax for import", + error::ErrorType::ParseError, pos)), + import_stmt_body) >> + (stmt) + ) +); + named!(statement, do_parse!( stmt: alt_complete!(