use crate::error::Span;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Seq,
Par,
Split,
Merge,
Feedback,
Delay,
Add,
Sub,
Mul,
Div,
Rem,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
Int(i64, Span),
Float(f64, Span),
Wire(Span),
Cut(Span),
Str(String, Span),
Ref(String, Span),
Apply {
name: String,
args: Vec<Expr>,
span: Span,
},
Neg(Box<Expr>, Span),
Bin {
op: BinOp,
lhs: Box<Expr>,
rhs: Box<Expr>,
span: Span,
},
}
impl Expr {
pub fn span(&self) -> Span {
match self {
Expr::Int(_, s)
| Expr::Float(_, s)
| Expr::Wire(s)
| Expr::Cut(s)
| Expr::Str(_, s)
| Expr::Ref(_, s)
| Expr::Neg(_, s) => *s,
Expr::Apply { span, .. } | Expr::Bin { span, .. } => *span,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Def {
pub name: String,
pub params: Vec<String>,
pub body: Expr,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Program {
pub defs: Vec<Def>,
}