mirror of
https://github.com/Noratrieb/ub.git
synced 2026-01-14 16:45:05 +01:00
things that kind of work
This commit is contained in:
parent
7087c9be0f
commit
cd73da6385
9 changed files with 55 additions and 32 deletions
|
|
@ -17,7 +17,7 @@ pub struct Ty {
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum TyKind {
|
pub enum TyKind {
|
||||||
U64,
|
U64,
|
||||||
Ptr(Box<TyKind>),
|
Ptr(Box<Ty>),
|
||||||
Name(String),
|
Name(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,19 +17,37 @@ fn ident_parser<'src>() -> impl Parser<Token<'src>, String, Error = Error<'src>>
|
||||||
let ident = select! {
|
let ident = select! {
|
||||||
Token::Ident(ident) => ident.to_owned(),
|
Token::Ident(ident) => ident.to_owned(),
|
||||||
};
|
};
|
||||||
ident.labelled("identifier")
|
ident.labelled("identifier").boxed()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ty_parser<'src>() -> impl Parser<Token<'src>, Ty, Error = Error<'src>> + Clone {
|
fn ty_parser<'src>() -> impl Parser<Token<'src>, Ty, Error = Error<'src>> + Clone {
|
||||||
filter_map(|span, token| {
|
recursive(|ty_parser| {
|
||||||
let kind = match token {
|
let primitive = filter_map(|span, token| {
|
||||||
Token::Ident("u64") => TyKind::U64,
|
let kind = match token {
|
||||||
_ => return Err(Simple::expected_input_found(span, Vec::new(), Some(token))),
|
Token::Ident("u64") => TyKind::U64,
|
||||||
};
|
_ => return Err(Simple::expected_input_found(span, Vec::new(), Some(token))),
|
||||||
|
};
|
||||||
|
Ok(Ty { span, kind })
|
||||||
|
})
|
||||||
|
.labelled("primitive type");
|
||||||
|
|
||||||
Ok(Ty { span, kind })
|
let ptr = just(Token::Asterisk)
|
||||||
|
.ignore_then(ty_parser.clone())
|
||||||
|
.map_with_span(|ty: Ty, span| Ty {
|
||||||
|
kind: TyKind::Ptr(Box::new(ty)),
|
||||||
|
span,
|
||||||
|
})
|
||||||
|
.labelled("pointer type");
|
||||||
|
|
||||||
|
let name = ident_parser()
|
||||||
|
.map_with_span(|name: String, span| Ty {
|
||||||
|
kind: TyKind::Name(name),
|
||||||
|
span,
|
||||||
|
})
|
||||||
|
.labelled("name type");
|
||||||
|
|
||||||
|
primitive.or(ptr).or(name).labelled("type").boxed()
|
||||||
})
|
})
|
||||||
.labelled("type")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expr_parser<'src>() -> impl Parser<Token<'src>, Expr, Error = Error<'src>> + Clone {
|
fn expr_parser<'src>() -> impl Parser<Token<'src>, Expr, Error = Error<'src>> + Clone {
|
||||||
|
|
@ -51,7 +69,7 @@ fn expr_parser<'src>() -> impl Parser<Token<'src>, Expr, Error = Error<'src>> +
|
||||||
.chain(just(Token::Comma).ignore_then(expr.clone()).repeated())
|
.chain(just(Token::Comma).ignore_then(expr.clone()).repeated())
|
||||||
.then_ignore(just(Token::Comma).or_not())
|
.then_ignore(just(Token::Comma).or_not())
|
||||||
.or_not()
|
.or_not()
|
||||||
.map(|item| item.unwrap_or_else(Vec::new));
|
.map(|item| item.unwrap_or_default());
|
||||||
|
|
||||||
let array = items
|
let array = items
|
||||||
.clone()
|
.clone()
|
||||||
|
|
@ -72,7 +90,7 @@ fn expr_parser<'src>() -> impl Parser<Token<'src>, Expr, Error = Error<'src>> +
|
||||||
.delimited_by(just(Token::ParenO), just(Token::ParenC))
|
.delimited_by(just(Token::ParenO), just(Token::ParenC))
|
||||||
.repeated(),
|
.repeated(),
|
||||||
)
|
)
|
||||||
.foldl(|callee, args| {
|
.foldl(|callee: Expr, args: Vec<Expr>| {
|
||||||
Expr::Call(Call {
|
Expr::Call(Call {
|
||||||
callee: Box::new(callee),
|
callee: Box::new(callee),
|
||||||
args,
|
args,
|
||||||
|
|
@ -126,7 +144,7 @@ fn expr_parser<'src>() -> impl Parser<Token<'src>, Expr, Error = Error<'src>> +
|
||||||
span: 0..0, // lol todo
|
span: 0..0, // lol todo
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
compare.labelled("comparison")
|
compare.labelled("comparison").boxed()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -244,8 +262,7 @@ fn item_parser<'src>() -> impl Parser<Token<'src>, Item, Error = Error<'src>> +
|
||||||
|
|
||||||
let ret_ty = just(Token::Arrow).ignore_then(ty_parser()).or_not();
|
let ret_ty = just(Token::Arrow).ignore_then(ty_parser()).or_not();
|
||||||
let function = just(Token::Fn)
|
let function = just(Token::Fn)
|
||||||
.map_with_span(|_, span| span)
|
.ignore_then(name)
|
||||||
.then(name)
|
|
||||||
.then(params)
|
.then(params)
|
||||||
.then(ret_ty)
|
.then(ret_ty)
|
||||||
.then(
|
.then(
|
||||||
|
|
@ -253,11 +270,11 @@ fn item_parser<'src>() -> impl Parser<Token<'src>, Item, Error = Error<'src>> +
|
||||||
.repeated()
|
.repeated()
|
||||||
.delimited_by(just(Token::BraceO), just(Token::BraceC)),
|
.delimited_by(just(Token::BraceO), just(Token::BraceC)),
|
||||||
)
|
)
|
||||||
.map(|((((fn_span, name), params), ret_ty), body)| FnDecl {
|
.map_with_span(|(((name, params), ret_ty), body), span| FnDecl {
|
||||||
name,
|
name,
|
||||||
params,
|
params,
|
||||||
ret_ty,
|
ret_ty,
|
||||||
span: fn_span,
|
span,
|
||||||
body,
|
body,
|
||||||
})
|
})
|
||||||
.labelled("function");
|
.labelled("function");
|
||||||
|
|
@ -274,10 +291,10 @@ fn file_parser<'src>(
|
||||||
file_name: PathBuf,
|
file_name: PathBuf,
|
||||||
) -> impl Parser<Token<'src>, File, Error = Error<'src>> + Clone {
|
) -> impl Parser<Token<'src>, File, Error = Error<'src>> + Clone {
|
||||||
item_parser()
|
item_parser()
|
||||||
// .repeated()
|
.repeated()
|
||||||
.map(move |items| File {
|
.map(move |items| File {
|
||||||
name: file_name.clone(),
|
name: file_name.clone(),
|
||||||
items: vec![items],
|
items,
|
||||||
})
|
})
|
||||||
.labelled("file")
|
.labelled("file")
|
||||||
}
|
}
|
||||||
|
|
@ -356,4 +373,10 @@ mod tests {
|
||||||
let r = parse("struct X { y: u64, x: u64 }");
|
let r = parse("struct X { y: u64, x: u64 }");
|
||||||
insta::assert_debug_snapshot!(r);
|
insta::assert_debug_snapshot!(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn types() {
|
||||||
|
let r = parse("fn types() -> *u64 { Test test = 2; *Hello = true; }");
|
||||||
|
insta::assert_debug_snapshot!(r);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: parser/src/parser.rs
|
source: parser/src/parser.rs
|
||||||
assertion_line: 272
|
assertion_line: 332
|
||||||
expression: r
|
expression: r
|
||||||
---
|
---
|
||||||
(
|
(
|
||||||
|
|
@ -13,7 +13,7 @@ expression: r
|
||||||
name: "main",
|
name: "main",
|
||||||
params: [],
|
params: [],
|
||||||
ret_ty: None,
|
ret_ty: None,
|
||||||
span: 0..2,
|
span: 0..20,
|
||||||
body: [
|
body: [
|
||||||
Expr(
|
Expr(
|
||||||
BinOp(
|
BinOp(
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: parser/src/parser.rs
|
source: parser/src/parser.rs
|
||||||
assertion_line: 278
|
assertion_line: 338
|
||||||
expression: r
|
expression: r
|
||||||
---
|
---
|
||||||
(
|
(
|
||||||
|
|
@ -13,7 +13,7 @@ expression: r
|
||||||
name: "main",
|
name: "main",
|
||||||
params: [],
|
params: [],
|
||||||
ret_ty: None,
|
ret_ty: None,
|
||||||
span: 0..2,
|
span: 0..32,
|
||||||
body: [
|
body: [
|
||||||
Expr(
|
Expr(
|
||||||
BinOp(
|
BinOp(
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: parser/src/parser.rs
|
source: parser/src/parser.rs
|
||||||
assertion_line: 284
|
assertion_line: 344
|
||||||
expression: r
|
expression: r
|
||||||
---
|
---
|
||||||
(
|
(
|
||||||
|
|
@ -18,7 +18,7 @@ expression: r
|
||||||
kind: U64,
|
kind: U64,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..2,
|
span: 0..26,
|
||||||
body: [
|
body: [
|
||||||
Expr(
|
Expr(
|
||||||
BinOp(
|
BinOp(
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: parser/src/parser.rs
|
source: parser/src/parser.rs
|
||||||
assertion_line: 330
|
assertion_line: 356
|
||||||
expression: r
|
expression: r
|
||||||
---
|
---
|
||||||
(
|
(
|
||||||
|
|
@ -18,7 +18,7 @@ expression: r
|
||||||
kind: U64,
|
kind: U64,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..2,
|
span: 0..39,
|
||||||
body: [
|
body: [
|
||||||
IfStmt(
|
IfStmt(
|
||||||
IfStmt {
|
IfStmt {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: parser/src/parser.rs
|
source: parser/src/parser.rs
|
||||||
assertion_line: 333
|
assertion_line: 350
|
||||||
expression: r
|
expression: r
|
||||||
---
|
---
|
||||||
(
|
(
|
||||||
|
|
@ -18,7 +18,7 @@ expression: r
|
||||||
kind: U64,
|
kind: U64,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..2,
|
span: 0..31,
|
||||||
body: [
|
body: [
|
||||||
IfStmt(
|
IfStmt(
|
||||||
IfStmt {
|
IfStmt {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: parser/src/parser.rs
|
source: parser/src/parser.rs
|
||||||
assertion_line: 319
|
assertion_line: 368
|
||||||
expression: r
|
expression: r
|
||||||
---
|
---
|
||||||
(
|
(
|
||||||
|
|
@ -18,7 +18,7 @@ expression: r
|
||||||
kind: U64,
|
kind: U64,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..2,
|
span: 0..34,
|
||||||
body: [
|
body: [
|
||||||
VarDecl(
|
VarDecl(
|
||||||
VarDecl {
|
VarDecl {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
source: parser/src/parser.rs
|
source: parser/src/parser.rs
|
||||||
assertion_line: 336
|
assertion_line: 362
|
||||||
expression: r
|
expression: r
|
||||||
---
|
---
|
||||||
(
|
(
|
||||||
|
|
@ -18,7 +18,7 @@ expression: r
|
||||||
kind: U64,
|
kind: U64,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
span: 0..2,
|
span: 0..34,
|
||||||
body: [
|
body: [
|
||||||
WhileStmt(
|
WhileStmt(
|
||||||
WhileStmt {
|
WhileStmt {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue