This commit is contained in:
nora 2022-04-09 11:57:40 +02:00
parent 535e95069d
commit 7087c9be0f
5 changed files with 155 additions and 11 deletions

View file

@ -19,7 +19,7 @@ pub fn parse(_str: &str, _file_name: PathBuf) -> Result<ast::File, ()> {
pub fn test() {
let src = "
fn main() {
if false {} else {}
u64 hello = 5;
}
";

View file

@ -136,6 +136,7 @@ fn statement_parser<'src>() -> impl Parser<Token<'src>, Stmt, Error = Error<'src
.then(ident_parser())
.then_ignore(just(Token::Eq))
.then(expr_parser())
.then_ignore(just(Token::Semi))
.map(|((ty, name), rhs)| {
Stmt::VarDecl(VarDecl {
name,
@ -176,16 +177,17 @@ fn statement_parser<'src>() -> impl Parser<Token<'src>, Stmt, Error = Error<'src
.delimited_by(just(Token::BraceO), just(Token::BraceC)),
)
.then(
just(Token::Else).ignore_then(
if_stmt
.map(|if_stmt| ElsePart::ElseIf(Box::new(if_stmt)))
.or(stmt
.clone()
.repeated()
.delimited_by(just(Token::BraceO), just(Token::BraceC))
.map_with_span(ElsePart::Else))
.or_not(),
),
just(Token::Else)
.ignore_then(
if_stmt
.map(|if_stmt| ElsePart::ElseIf(Box::new(if_stmt)))
.or(stmt
.clone()
.repeated()
.delimited_by(just(Token::BraceO), just(Token::BraceC))
.map_with_span(ElsePart::Else)),
)
.or_not(),
)
.map_with_span(|((cond, body), else_part), span| IfStmt {
cond,
@ -325,6 +327,24 @@ mod tests {
insta::assert_debug_snapshot!(r);
}
#[test]
fn if_no_else() {
let r = parse("fn foo() -> u64 { if false {} }");
insta::assert_debug_snapshot!(r);
}
#[test]
fn if_else() {
let r = parse("fn foo() -> u64 { if false {} else {} }");
insta::assert_debug_snapshot!(r);
}
#[test]
fn while_loop() {
let r = parse("fn foo() -> u64 { while false {} }");
insta::assert_debug_snapshot!(r);
}
#[test]
fn var_decl() {
let r = parse("fn foo() -> u64 { u64 hello = 5; }");

View file

@ -0,0 +1,45 @@
---
source: parser/src/parser.rs
assertion_line: 330
expression: r
---
(
Some(
File {
name: "parser__parser__tests",
items: [
FnDecl(
FnDecl {
name: "foo",
params: [],
ret_ty: Some(
Ty {
span: 12..15,
kind: U64,
},
),
span: 0..2,
body: [
IfStmt(
IfStmt {
cond: Name(
"false",
),
body: [],
else_part: Some(
Else(
[],
35..37,
),
),
span: 18..37,
},
),
],
},
),
],
},
),
[],
)

View file

@ -0,0 +1,40 @@
---
source: parser/src/parser.rs
assertion_line: 333
expression: r
---
(
Some(
File {
name: "parser__parser__tests",
items: [
FnDecl(
FnDecl {
name: "foo",
params: [],
ret_ty: Some(
Ty {
span: 12..15,
kind: U64,
},
),
span: 0..2,
body: [
IfStmt(
IfStmt {
cond: Name(
"false",
),
body: [],
else_part: None,
span: 18..29,
},
),
],
},
),
],
},
),
[],
)

View file

@ -0,0 +1,39 @@
---
source: parser/src/parser.rs
assertion_line: 336
expression: r
---
(
Some(
File {
name: "parser__parser__tests",
items: [
FnDecl(
FnDecl {
name: "foo",
params: [],
ret_ty: Some(
Ty {
span: 12..15,
kind: U64,
},
),
span: 0..2,
body: [
WhileStmt(
WhileStmt {
cond: Name(
"false",
),
body: [],
span: 18..32,
},
),
],
},
),
],
},
),
[],
)