parser semicolon fix
This commit is contained in:
parent
792cbd030d
commit
0edde5d50c
4 changed files with 69 additions and 17 deletions
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)? {
|
||||||
Ok(Some(ast::Definition {
|
if let Some(_) = tokens.next_if(&Token::Semicolon) {
|
||||||
mutable,
|
Ok(Some(ast::Definition {
|
||||||
name,
|
mutable,
|
||||||
expr,
|
name,
|
||||||
}))
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue