parser semicolon fix

This commit is contained in:
me 2025-12-19 22:24:38 +02:00
parent 792cbd030d
commit 0edde5d50c
4 changed files with 69 additions and 17 deletions

View file

@ -20,6 +20,8 @@ let setup = fn() {
}; };
let update = fn(state, events) { let update = fn(state, events) {
let new = 100;
state.player.position.x = new;
return state; return state;
}; };

View file

@ -1,4 +1,8 @@
pub mod types;
pub mod scanner;
pub mod parser; pub mod parser;
pub use parser::*; pub mod scanner;
pub mod types;
pub fn parse_file(code: String) -> Result<crate::ast::Program, types::Error> {
let mut tokens = scanner::scan(code);
parser::parse(&mut tokens, parser::parse_program)
}

View file

@ -25,14 +25,7 @@ fn parse_definitions(tokens: &mut Tokens) -> ParseResult<Vec<ast::Definition>> {
fn parse_set(tokens: &mut Tokens) -> ParseResult<ast::Expr> { fn parse_set(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
if let Some(_eq) = tokens.next_if(&Token::Equals) { if let Some(_eq) = tokens.next_if(&Token::Equals) {
if let Some(expr) = parse_expr(tokens)? { if let Some(expr) = parse_expr(tokens)? {
if let Some(_) = tokens.next_if(&Token::Semicolon) {
Ok(Some(expr)) Ok(Some(expr))
} else {
Err(Error::UnexpectedToken {
expected: Token::Semicolon,
got: tokens.next(),
})
}
} else { } else {
Err(Error::UnexpectedTokenForParser( Err(Error::UnexpectedTokenForParser(
"expr".into(), "expr".into(),
@ -65,11 +58,18 @@ fn parse_definition(tokens: &mut Tokens) -> ParseResult<ast::Definition> {
}; };
if let Some(name) = parse_identifier_name(tokens)? { if let Some(name) = parse_identifier_name(tokens)? {
if let Some(expr) = parse_set(tokens)? { if let Some(expr) = parse_set(tokens)? {
if let Some(_) = tokens.next_if(&Token::Semicolon) {
Ok(Some(ast::Definition { Ok(Some(ast::Definition {
mutable, mutable,
name, name,
expr, expr,
})) }))
} else {
Err(Error::UnexpectedToken {
expected: Token::Semicolon,
got: tokens.next(),
})
}
} else { } else {
Err(Error::UnexpectedToken { Err(Error::UnexpectedToken {
expected: Token::Equals, expected: Token::Equals,
@ -162,6 +162,7 @@ fn parse_statement(tokens: &mut Tokens) -> ParseResult<ast::Statement> {
if let Some(_) = tokens.next_if(&Token::Semicolon) { if let Some(_) = tokens.next_if(&Token::Semicolon) {
Ok(Some(expr)) Ok(Some(expr))
} else { } else {
println!("parse statement expr");
Err(Error::UnexpectedToken { Err(Error::UnexpectedToken {
expected: Token::Semicolon, expected: Token::Semicolon,
got: tokens.next(), got: tokens.next(),
@ -358,7 +359,7 @@ mod tests {
} }
#[test] #[test]
fn assign() { fn assign() {
let program = "x = [2, { .hello: 7 }];".to_string(); let program = "x = [2, { .hello: 7 }]".to_string();
let result = parse(&mut scan(program), parse_expr); let result = parse(&mut scan(program), parse_expr);
insta::assert_debug_snapshot!(result); insta::assert_debug_snapshot!(result);
} }
@ -402,6 +403,8 @@ let setup = fn() {
}; };
let update = fn(state, events) { let update = fn(state, events) {
let new = 100;
state.player.position.x = new;
return state; return state;
}; };

View file

@ -74,6 +74,49 @@ Ok(
], ],
body: Block( body: Block(
[ [
Let(
Definition {
mutable: false,
name: Name(
"new",
),
expr: Value(
Int(
100,
),
),
},
),
Expr(
Op {
lhs: Access {
expr: Access {
expr: Access {
expr: Var(
Name(
"state",
),
),
field: Label(
"player",
),
},
field: Label(
"position",
),
},
field: Label(
"x",
),
},
op: Assign,
rhs: Var(
Name(
"new",
),
),
},
),
Return( Return(
Some( Some(
Var( Var(