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)]
|
||||
pub enum TyKind {
|
||||
U64,
|
||||
Ptr(Box<TyKind>),
|
||||
Ptr(Box<Ty>),
|
||||
Name(String),
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,19 +17,37 @@ fn ident_parser<'src>() -> impl Parser<Token<'src>, String, Error = Error<'src>>
|
|||
let ident = select! {
|
||||
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 {
|
||||
filter_map(|span, token| {
|
||||
let kind = match token {
|
||||
Token::Ident("u64") => TyKind::U64,
|
||||
_ => return Err(Simple::expected_input_found(span, Vec::new(), Some(token))),
|
||||
};
|
||||
recursive(|ty_parser| {
|
||||
let primitive = filter_map(|span, token| {
|
||||
let kind = match 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 {
|
||||
|
|
@ -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())
|
||||
.then_ignore(just(Token::Comma).or_not())
|
||||
.or_not()
|
||||
.map(|item| item.unwrap_or_else(Vec::new));
|
||||
.map(|item| item.unwrap_or_default());
|
||||
|
||||
let array = items
|
||||
.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))
|
||||
.repeated(),
|
||||
)
|
||||
.foldl(|callee, args| {
|
||||
.foldl(|callee: Expr, args: Vec<Expr>| {
|
||||
Expr::Call(Call {
|
||||
callee: Box::new(callee),
|
||||
args,
|
||||
|
|
@ -126,7 +144,7 @@ fn expr_parser<'src>() -> impl Parser<Token<'src>, Expr, Error = Error<'src>> +
|
|||
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 function = just(Token::Fn)
|
||||
.map_with_span(|_, span| span)
|
||||
.then(name)
|
||||
.ignore_then(name)
|
||||
.then(params)
|
||||
.then(ret_ty)
|
||||
.then(
|
||||
|
|
@ -253,11 +270,11 @@ fn item_parser<'src>() -> impl Parser<Token<'src>, Item, Error = Error<'src>> +
|
|||
.repeated()
|
||||
.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,
|
||||
params,
|
||||
ret_ty,
|
||||
span: fn_span,
|
||||
span,
|
||||
body,
|
||||
})
|
||||
.labelled("function");
|
||||
|
|
@ -274,10 +291,10 @@ fn file_parser<'src>(
|
|||
file_name: PathBuf,
|
||||
) -> impl Parser<Token<'src>, File, Error = Error<'src>> + Clone {
|
||||
item_parser()
|
||||
// .repeated()
|
||||
.repeated()
|
||||
.map(move |items| File {
|
||||
name: file_name.clone(),
|
||||
items: vec![items],
|
||||
items,
|
||||
})
|
||||
.labelled("file")
|
||||
}
|
||||
|
|
@ -356,4 +373,10 @@ mod tests {
|
|||
let r = parse("struct X { y: u64, x: u64 }");
|
||||
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
|
||||
assertion_line: 272
|
||||
assertion_line: 332
|
||||
expression: r
|
||||
---
|
||||
(
|
||||
|
|
@ -13,7 +13,7 @@ expression: r
|
|||
name: "main",
|
||||
params: [],
|
||||
ret_ty: None,
|
||||
span: 0..2,
|
||||
span: 0..20,
|
||||
body: [
|
||||
Expr(
|
||||
BinOp(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: parser/src/parser.rs
|
||||
assertion_line: 278
|
||||
assertion_line: 338
|
||||
expression: r
|
||||
---
|
||||
(
|
||||
|
|
@ -13,7 +13,7 @@ expression: r
|
|||
name: "main",
|
||||
params: [],
|
||||
ret_ty: None,
|
||||
span: 0..2,
|
||||
span: 0..32,
|
||||
body: [
|
||||
Expr(
|
||||
BinOp(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: parser/src/parser.rs
|
||||
assertion_line: 284
|
||||
assertion_line: 344
|
||||
expression: r
|
||||
---
|
||||
(
|
||||
|
|
@ -18,7 +18,7 @@ expression: r
|
|||
kind: U64,
|
||||
},
|
||||
),
|
||||
span: 0..2,
|
||||
span: 0..26,
|
||||
body: [
|
||||
Expr(
|
||||
BinOp(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: parser/src/parser.rs
|
||||
assertion_line: 330
|
||||
assertion_line: 356
|
||||
expression: r
|
||||
---
|
||||
(
|
||||
|
|
@ -18,7 +18,7 @@ expression: r
|
|||
kind: U64,
|
||||
},
|
||||
),
|
||||
span: 0..2,
|
||||
span: 0..39,
|
||||
body: [
|
||||
IfStmt(
|
||||
IfStmt {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: parser/src/parser.rs
|
||||
assertion_line: 333
|
||||
assertion_line: 350
|
||||
expression: r
|
||||
---
|
||||
(
|
||||
|
|
@ -18,7 +18,7 @@ expression: r
|
|||
kind: U64,
|
||||
},
|
||||
),
|
||||
span: 0..2,
|
||||
span: 0..31,
|
||||
body: [
|
||||
IfStmt(
|
||||
IfStmt {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: parser/src/parser.rs
|
||||
assertion_line: 319
|
||||
assertion_line: 368
|
||||
expression: r
|
||||
---
|
||||
(
|
||||
|
|
@ -18,7 +18,7 @@ expression: r
|
|||
kind: U64,
|
||||
},
|
||||
),
|
||||
span: 0..2,
|
||||
span: 0..34,
|
||||
body: [
|
||||
VarDecl(
|
||||
VarDecl {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: parser/src/parser.rs
|
||||
assertion_line: 336
|
||||
assertion_line: 362
|
||||
expression: r
|
||||
---
|
||||
(
|
||||
|
|
@ -18,7 +18,7 @@ expression: r
|
|||
kind: U64,
|
||||
},
|
||||
),
|
||||
span: 0..2,
|
||||
span: 0..34,
|
||||
body: [
|
||||
WhileStmt(
|
||||
WhileStmt {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue