mirror of
https://github.com/Noratrieb/ub.git
synced 2026-01-16 17:45:08 +01:00
🎉
This commit is contained in:
parent
535e95069d
commit
7087c9be0f
5 changed files with 155 additions and 11 deletions
|
|
@ -19,7 +19,7 @@ pub fn parse(_str: &str, _file_name: PathBuf) -> Result<ast::File, ()> {
|
||||||
pub fn test() {
|
pub fn test() {
|
||||||
let src = "
|
let src = "
|
||||||
fn main() {
|
fn main() {
|
||||||
if false {} else {}
|
u64 hello = 5;
|
||||||
}
|
}
|
||||||
";
|
";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -136,6 +136,7 @@ fn statement_parser<'src>() -> impl Parser<Token<'src>, Stmt, Error = Error<'src
|
||||||
.then(ident_parser())
|
.then(ident_parser())
|
||||||
.then_ignore(just(Token::Eq))
|
.then_ignore(just(Token::Eq))
|
||||||
.then(expr_parser())
|
.then(expr_parser())
|
||||||
|
.then_ignore(just(Token::Semi))
|
||||||
.map(|((ty, name), rhs)| {
|
.map(|((ty, name), rhs)| {
|
||||||
Stmt::VarDecl(VarDecl {
|
Stmt::VarDecl(VarDecl {
|
||||||
name,
|
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)),
|
.delimited_by(just(Token::BraceO), just(Token::BraceC)),
|
||||||
)
|
)
|
||||||
.then(
|
.then(
|
||||||
just(Token::Else).ignore_then(
|
just(Token::Else)
|
||||||
|
.ignore_then(
|
||||||
if_stmt
|
if_stmt
|
||||||
.map(|if_stmt| ElsePart::ElseIf(Box::new(if_stmt)))
|
.map(|if_stmt| ElsePart::ElseIf(Box::new(if_stmt)))
|
||||||
.or(stmt
|
.or(stmt
|
||||||
.clone()
|
.clone()
|
||||||
.repeated()
|
.repeated()
|
||||||
.delimited_by(just(Token::BraceO), just(Token::BraceC))
|
.delimited_by(just(Token::BraceO), just(Token::BraceC))
|
||||||
.map_with_span(ElsePart::Else))
|
.map_with_span(ElsePart::Else)),
|
||||||
|
)
|
||||||
.or_not(),
|
.or_not(),
|
||||||
),
|
|
||||||
)
|
)
|
||||||
.map_with_span(|((cond, body), else_part), span| IfStmt {
|
.map_with_span(|((cond, body), else_part), span| IfStmt {
|
||||||
cond,
|
cond,
|
||||||
|
|
@ -325,6 +327,24 @@ mod tests {
|
||||||
insta::assert_debug_snapshot!(r);
|
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]
|
#[test]
|
||||||
fn var_decl() {
|
fn var_decl() {
|
||||||
let r = parse("fn foo() -> u64 { u64 hello = 5; }");
|
let r = parse("fn foo() -> u64 { u64 hello = 5; }");
|
||||||
|
|
|
||||||
45
parser/src/snapshots/parser__parser__tests__if_else.snap
Normal file
45
parser/src/snapshots/parser__parser__tests__if_else.snap
Normal 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,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
[],
|
||||||
|
)
|
||||||
40
parser/src/snapshots/parser__parser__tests__if_no_else.snap
Normal file
40
parser/src/snapshots/parser__parser__tests__if_no_else.snap
Normal 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,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
[],
|
||||||
|
)
|
||||||
39
parser/src/snapshots/parser__parser__tests__while_loop.snap
Normal file
39
parser/src/snapshots/parser__parser__tests__while_loop.snap
Normal 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,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
[],
|
||||||
|
)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue