Files
boring-lang/src/ast.rs

97 lines
2.1 KiB
Rust
Raw Normal View History

2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Span {
pub left: usize,
pub right: usize
}
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Spanned<T> {
pub span: Span,
pub value: T,
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct TypeUsage {
pub name: Spanned<Identifier>
//TODO: Generics go here
}
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub enum Operator {
Mul,
Div,
Plus,
Minus,
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct LiteralInt {
2020-07-23 23:54:01 -06:00
pub value: i64,
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Identifier {
2020-07-23 23:54:01 -06:00
pub name: String,
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
2020-04-13 23:59:01 -06:00
pub struct FunctionCall {
2020-07-23 23:54:01 -06:00
pub name: Spanned<Identifier>,
pub arguments: Vec<Spanned<Box<Expression>>>,
2020-04-13 23:59:01 -06:00
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Operation {
pub left: Spanned<Box<Expression>>,
pub op: Operator,
pub right: Spanned<Box<Expression>>,
}
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub enum Expression {
2020-07-23 23:54:01 -06:00
LiteralInt(Spanned<LiteralInt>),
FunctionCall(Spanned<FunctionCall>),
Identifier(Spanned<Identifier>),
Op(Operation),
}
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Assignment {
pub name: Spanned<Identifier>,
pub type_usage: Option<Spanned<TypeUsage>>,
// mut, weak here
pub expression: Spanned<Box<Expression>>,
}
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub enum Statement {
Assignment(Spanned<Assignment>),
Expression(Spanned<Box<Expression>>),
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Block {
2020-07-23 23:54:01 -06:00
pub statements: Vec<Spanned<Statement>>,
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct VariableDeclaration {
2020-07-23 23:54:01 -06:00
pub name: Spanned<Identifier>,
pub type_usage: Spanned<TypeUsage>,
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Function {
2020-07-23 23:54:01 -06:00
pub name: Spanned<Identifier>,
pub arguments: Vec<VariableDeclaration>,
2020-07-23 23:54:01 -06:00
pub return_type: Spanned<TypeUsage>,
pub block: Block,
}
2020-07-23 23:54:01 -06:00
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
2020-04-13 23:59:01 -06:00
pub struct Module {
pub functions: Vec<Function>,
}