This commit is contained in:
nora 2023-01-22 20:19:34 +01:00
parent 6c92f2b41f
commit 134d23299a
5 changed files with 88 additions and 37 deletions

View file

@ -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,
} }

View file

@ -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}"),

View file

@ -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);

View file

@ -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,

View file

@ -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,
},
),
], ],
}, },
), ),