AST goes brrrr
This commit is contained in:
parent
b70865071a
commit
1190ac5bce
2
rustfmt.toml
Normal file
2
rustfmt.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
enum_discrim_align_threshold = 16
|
||||||
|
struct_field_align_threshold = 16
|
|
@ -0,0 +1,117 @@
|
||||||
|
use lasso::Spur;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub struct Span {
|
||||||
|
pub start: usize,
|
||||||
|
pub end: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<std::ops::Range<usize>> for Span {
|
||||||
|
fn from(value: std::ops::Range<usize>) -> Self {
|
||||||
|
Self {
|
||||||
|
start: value.start,
|
||||||
|
end: value.end,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub struct Spanned<T> {
|
||||||
|
pub item: T,
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Spanned<T> {
|
||||||
|
#[inline]
|
||||||
|
pub fn new(item: T, span: impl Into<Span>) -> Self {
|
||||||
|
Self {
|
||||||
|
item,
|
||||||
|
span: span.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type SpanExpr<'a> = Spanned<Expr<'a>>;
|
||||||
|
pub type ExprRef<'a> = &'a SpanExpr<'a>;
|
||||||
|
pub type ExprList<'a> = &'a [SpanExpr<'a>];
|
||||||
|
pub type Ident = Spur;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum Expr<'a> {
|
||||||
|
Ident(Ident),
|
||||||
|
Path(ExprList<'a>),
|
||||||
|
Literal(Literal),
|
||||||
|
Call(ExprRef<'a>, ExprList<'a>),
|
||||||
|
Binary(Spanned<BinaryOp>, ExprRef<'a>, ExprRef<'a>),
|
||||||
|
Unary(Spanned<UnaryOp>, ExprRef<'a>),
|
||||||
|
Def {
|
||||||
|
kind: DefKind,
|
||||||
|
ident: Spanned<Ident>,
|
||||||
|
ty: Option<Spanned<Type>>,
|
||||||
|
init: Option<ExprRef<'a>>,
|
||||||
|
},
|
||||||
|
Set(ExprRef<'a>, ExprRef<'a>),
|
||||||
|
Loop(ExprList<'a>),
|
||||||
|
Block(ExprList<'a>),
|
||||||
|
Switch {
|
||||||
|
on: ExprRef<'a>,
|
||||||
|
branches: &'a [(Spanned<Switcher>, ExprRef<'a>)],
|
||||||
|
else_: ExprRef<'a>,
|
||||||
|
},
|
||||||
|
CondSwitch {
|
||||||
|
branches: &'a [(ExprRef<'a>, ExprRef<'a>)],
|
||||||
|
else_: ExprRef<'a>,
|
||||||
|
},
|
||||||
|
Func {
|
||||||
|
ident: Spanned<Ident>,
|
||||||
|
params: &'a [(Spanned<Ident>, Spanned<Type>)],
|
||||||
|
ret: Spanned<Type>,
|
||||||
|
body: ExprList<'a>,
|
||||||
|
},
|
||||||
|
Break(Option<ExprRef<'a>>),
|
||||||
|
Return(Option<ExprRef<'a>>),
|
||||||
|
Continue,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum Type {
|
||||||
|
Ident(Ident),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum Switcher {
|
||||||
|
Literal(Literal),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum DefKind {
|
||||||
|
Const,
|
||||||
|
Var,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum Literal {
|
||||||
|
String(Spur),
|
||||||
|
Int(u64),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum BinaryOp {
|
||||||
|
Plus,
|
||||||
|
Minus,
|
||||||
|
Star,
|
||||||
|
Slash,
|
||||||
|
Equ,
|
||||||
|
Neq,
|
||||||
|
Lt,
|
||||||
|
Gt,
|
||||||
|
LtEq,
|
||||||
|
GtEq,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum UnaryOp {
|
||||||
|
Minus,
|
||||||
|
Not,
|
||||||
|
Star,
|
||||||
|
}
|
|
@ -47,6 +47,10 @@ pub enum Token {
|
||||||
#[token("include")] Include,
|
#[token("include")] Include,
|
||||||
#[token("switch")] Switch,
|
#[token("switch")] Switch,
|
||||||
#[token("loop")] Loop,
|
#[token("loop")] Loop,
|
||||||
|
#[token("return")] Return,
|
||||||
|
#[token("break")] Break,
|
||||||
|
#[token("continue")] Continue,
|
||||||
|
#[token("uninit")] Uninit,
|
||||||
#[token("asm")] Asm,
|
#[token("asm")] Asm,
|
||||||
|
|
||||||
#[regex(
|
#[regex(
|
||||||
|
|
Loading…
Reference in a new issue