mirror of
https://github.com/Noratrieb/ub.git
synced 2026-01-14 16:45:05 +01:00
Let
This commit is contained in:
parent
6c92f2b41f
commit
134d23299a
5 changed files with 88 additions and 37 deletions
|
|
@ -70,7 +70,7 @@ pub enum Stmt {
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct VarDecl {
|
pub struct VarDecl {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub ty: Ty,
|
pub ty: Option<Ty>,
|
||||||
pub rhs: Option<Expr>,
|
pub rhs: Option<Expr>,
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,8 @@ pub enum Token<'a> {
|
||||||
Loop,
|
Loop,
|
||||||
#[token("ptr")]
|
#[token("ptr")]
|
||||||
Ptr,
|
Ptr,
|
||||||
|
#[token("let")]
|
||||||
|
Let,
|
||||||
|
|
||||||
#[regex(r"[a-zA-Z_]\w*")]
|
#[regex(r"[a-zA-Z_]\w*")]
|
||||||
Ident(&'a str),
|
Ident(&'a str),
|
||||||
|
|
@ -134,6 +136,7 @@ impl<'a> Display for Token<'a> {
|
||||||
Token::While => f.write_str("while"),
|
Token::While => f.write_str("while"),
|
||||||
Token::Loop => f.write_str("loop"),
|
Token::Loop => f.write_str("loop"),
|
||||||
Token::Ptr => f.write_str("ptr"),
|
Token::Ptr => f.write_str("ptr"),
|
||||||
|
Token::Let => f.write_str("let"),
|
||||||
Token::Ident(ident) => write!(f, "identifier `{ident}`"),
|
Token::Ident(ident) => write!(f, "identifier `{ident}`"),
|
||||||
Token::String(str) => write!(f, "\"{str}\""),
|
Token::String(str) => write!(f, "\"{str}\""),
|
||||||
Token::Integer(int) => write!(f, "{int}"),
|
Token::Integer(int) => write!(f, "{int}"),
|
||||||
|
|
|
||||||
|
|
@ -233,16 +233,16 @@ fn statement_parser<'src>(
|
||||||
state: &'src ParserState,
|
state: &'src ParserState,
|
||||||
) -> impl Parser<Token<'src>, Stmt, Error = Error<'src>> + Clone {
|
) -> impl Parser<Token<'src>, Stmt, Error = Error<'src>> + Clone {
|
||||||
recursive(|stmt| {
|
recursive(|stmt| {
|
||||||
let var_decl = ty_parser()
|
let var_decl = just(Token::Let)
|
||||||
.then(ident_parser())
|
.ignore_then(ident_parser())
|
||||||
.then_ignore(just(Token::Eq))
|
.then(just(Token::Colon).ignore_then(ty_parser()).or_not())
|
||||||
.then(expr_parser(state))
|
.then(just(Token::Eq).ignore_then(expr_parser(state)).or_not())
|
||||||
.then_ignore(just(Token::Semi))
|
.then_ignore(just(Token::Semi))
|
||||||
.map(|((ty, name), rhs)| {
|
.map(|((name, ty), rhs)| {
|
||||||
Stmt::VarDecl(VarDecl {
|
Stmt::VarDecl(VarDecl {
|
||||||
name,
|
name,
|
||||||
ty,
|
ty,
|
||||||
rhs: Some(rhs),
|
rhs,
|
||||||
span: Default::default(),
|
span: Default::default(),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
@ -492,7 +492,7 @@ mod tests {
|
||||||
fn var_decl() {
|
fn var_decl() {
|
||||||
let state = ParserState::default();
|
let state = ParserState::default();
|
||||||
|
|
||||||
let r = parse("fn foo() -> u64 { u64 hello = 5; }", &state);
|
let r = parse("fn foo() -> u64 { let hello: u64 = 5; let owo = 0; let nice: u64; let nothing; }", &state);
|
||||||
insta::assert_debug_snapshot!(r);
|
insta::assert_debug_snapshot!(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -509,7 +509,7 @@ mod tests {
|
||||||
let state = ParserState::default();
|
let state = ParserState::default();
|
||||||
|
|
||||||
let r = parse(
|
let r = parse(
|
||||||
"fn types() -> ptr u64 { Test test = 2; ptr u64 int = 25; }",
|
"fn types() -> ptr u64 { let test: Test = 2; let int: ptr u64 = 25; }",
|
||||||
&state,
|
&state,
|
||||||
);
|
);
|
||||||
insta::assert_debug_snapshot!(r);
|
insta::assert_debug_snapshot!(r);
|
||||||
|
|
|
||||||
|
|
@ -25,29 +25,31 @@ expression: r
|
||||||
id: NodeId(
|
id: NodeId(
|
||||||
2,
|
2,
|
||||||
),
|
),
|
||||||
span: 0..58,
|
span: 0..68,
|
||||||
body: [
|
body: [
|
||||||
VarDecl(
|
VarDecl(
|
||||||
VarDecl {
|
VarDecl {
|
||||||
name: "test",
|
name: "test",
|
||||||
ty: Ty {
|
ty: Some(
|
||||||
span: 24..28,
|
Ty {
|
||||||
kind: Name(
|
span: 34..38,
|
||||||
"Test",
|
kind: Name(
|
||||||
),
|
"Test",
|
||||||
},
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
rhs: Some(
|
rhs: Some(
|
||||||
Expr {
|
Expr {
|
||||||
kind: Literal(
|
kind: Literal(
|
||||||
Integer(
|
Integer(
|
||||||
2,
|
2,
|
||||||
36..37,
|
41..42,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
id: NodeId(
|
id: NodeId(
|
||||||
0,
|
0,
|
||||||
),
|
),
|
||||||
span: 36..37,
|
span: 41..42,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..0,
|
span: 0..0,
|
||||||
|
|
@ -56,27 +58,29 @@ expression: r
|
||||||
VarDecl(
|
VarDecl(
|
||||||
VarDecl {
|
VarDecl {
|
||||||
name: "int",
|
name: "int",
|
||||||
ty: Ty {
|
ty: Some(
|
||||||
span: 39..46,
|
Ty {
|
||||||
kind: Ptr(
|
span: 53..60,
|
||||||
Ty {
|
kind: Ptr(
|
||||||
span: 43..46,
|
Ty {
|
||||||
kind: U64,
|
span: 57..60,
|
||||||
},
|
kind: U64,
|
||||||
),
|
},
|
||||||
},
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
rhs: Some(
|
rhs: Some(
|
||||||
Expr {
|
Expr {
|
||||||
kind: Literal(
|
kind: Literal(
|
||||||
Integer(
|
Integer(
|
||||||
25,
|
25,
|
||||||
53..55,
|
63..65,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
id: NodeId(
|
id: NodeId(
|
||||||
1,
|
1,
|
||||||
),
|
),
|
||||||
span: 53..55,
|
span: 63..65,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..0,
|
span: 0..0,
|
||||||
|
|
|
||||||
|
|
@ -18,34 +18,78 @@ expression: r
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
id: NodeId(
|
id: NodeId(
|
||||||
1,
|
2,
|
||||||
),
|
),
|
||||||
span: 0..34,
|
span: 0..80,
|
||||||
body: [
|
body: [
|
||||||
VarDecl(
|
VarDecl(
|
||||||
VarDecl {
|
VarDecl {
|
||||||
name: "hello",
|
name: "hello",
|
||||||
ty: Ty {
|
ty: Some(
|
||||||
span: 18..21,
|
Ty {
|
||||||
kind: U64,
|
span: 29..32,
|
||||||
},
|
kind: U64,
|
||||||
|
},
|
||||||
|
),
|
||||||
rhs: Some(
|
rhs: Some(
|
||||||
Expr {
|
Expr {
|
||||||
kind: Literal(
|
kind: Literal(
|
||||||
Integer(
|
Integer(
|
||||||
5,
|
5,
|
||||||
30..31,
|
35..36,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
id: NodeId(
|
id: NodeId(
|
||||||
0,
|
0,
|
||||||
),
|
),
|
||||||
span: 30..31,
|
span: 35..36,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..0,
|
span: 0..0,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
VarDecl(
|
||||||
|
VarDecl {
|
||||||
|
name: "owo",
|
||||||
|
ty: None,
|
||||||
|
rhs: Some(
|
||||||
|
Expr {
|
||||||
|
kind: Literal(
|
||||||
|
Integer(
|
||||||
|
0,
|
||||||
|
48..49,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
id: NodeId(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
span: 48..49,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
span: 0..0,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
VarDecl(
|
||||||
|
VarDecl {
|
||||||
|
name: "nice",
|
||||||
|
ty: Some(
|
||||||
|
Ty {
|
||||||
|
span: 61..64,
|
||||||
|
kind: U64,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
rhs: None,
|
||||||
|
span: 0..0,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
VarDecl(
|
||||||
|
VarDecl {
|
||||||
|
name: "nothing",
|
||||||
|
ty: None,
|
||||||
|
rhs: None,
|
||||||
|
span: 0..0,
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue