use crate::token::{
Arrow, Color, Corner, Dir, EnvVar, Func1, Func2, LineType, Param, Prim, TextPos,
};
#[derive(Debug, Clone, PartialEq)]
pub struct Picture {
pub width: Option<Expr>,
pub height: Option<Expr>,
pub stmts: Vec<Stmt>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Label {
pub name: String,
pub subscript: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Stmt {
Object {
label: Option<Label>,
object: Object,
},
Place { label: Label, pos: Position },
Assign(Vec<Assignment>),
Direction(Dir),
Group(Vec<Stmt>),
Animate(Animate),
If {
cond: Expr,
then_body: Vec<Stmt>,
else_body: Option<Vec<Stmt>>,
},
For {
var: String,
from: Expr,
to: Expr,
by: Expr,
mult: bool,
body: Vec<Stmt>,
},
Print(PrintItem),
Reset(Vec<EnvVar>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum PrintItem {
Str(StringExpr),
Expr(Expr),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Animate {
pub target: Place,
pub effect: StringExpr,
pub duration: Option<Expr>,
pub timing: Timing,
pub delay: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Timing {
Sequential,
At(Expr),
After(Place),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Assignment {
pub target: AssignTarget,
pub op: AssignOp,
pub value: Expr,
}
#[derive(Debug, Clone, PartialEq)]
pub enum AssignTarget {
Var(String, Option<Expr>),
Env(EnvVar),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssignOp {
Set, Add, Sub, Mul, Div, Rem, }
#[derive(Debug, Clone, PartialEq)]
pub struct Object {
pub kind: ObjectKind,
pub attrs: Vec<Attr>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ObjectKind {
Primitive(Prim),
Block(Vec<Stmt>),
Empty,
Text,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Attr {
Dim(DimKind, Expr),
Direction(Dir, Option<Expr>),
LineStyle(LineType, Option<Expr>),
Chop(Option<Expr>),
Fill(Option<Expr>),
Arrowhead(Arrow, Option<Expr>),
Then,
Cw,
Ccw,
Same,
Continue,
Text(StringExpr),
TextPos(TextPos),
From(Position),
To(Position),
At(Position),
By(Position),
With { anchor: WithAnchor, at: Position },
Color(Color, StringExpr),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DimKind {
Ht,
Wid,
Rad,
Diam,
Thick,
Scaled,
}
#[derive(Debug, Clone, PartialEq)]
pub enum WithAnchor {
Corner(Corner),
Pair(Expr, Expr),
Plain,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Position {
Pair(Expr, Expr),
Place(Location, Vec<Shift>),
Between {
frac: Box<Expr>,
a: Box<Position>,
b: Box<Position>,
of_the_way: bool,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct Shift {
pub sign: Sign,
pub loc: Location,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Sign {
Plus,
Minus,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Location {
Place(Place),
Paren(Box<Position>),
ParenPair(Box<Position>, Box<Position>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Place {
Name {
name: String,
subscript: Option<Box<Expr>>,
},
Nth {
count: Nth,
obj: PrimObj,
},
Corner(Box<Place>, Corner),
CornerOf(Corner, Box<Place>),
Member(Box<Place>, Box<Place>),
Here,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Nth {
Last,
Count(Box<Expr>, bool),
}
#[derive(Debug, Clone, PartialEq)]
pub enum PrimObj {
Prim(Prim),
Block,
Str(String),
EmptyBrack,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StringExpr {
Lit(String),
Concat(Box<StringExpr>, Box<StringExpr>),
Sprintf(Box<StringExpr>, Vec<Expr>),
Arg(u32),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
Num(f64),
Var(String),
Env(EnvVar),
Unary(UnOp, Box<Expr>),
Bin(BinOp, Box<Expr>, Box<Expr>),
Func1(Func1, Box<Expr>),
Func2(Func2, Box<Expr>, Box<Expr>),
Rand(Option<Box<Expr>>),
DotX(Location),
DotY(Location),
PlaceAttr(Place, Param),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnOp {
Neg,
Pos,
Not,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Add,
Sub,
Mul,
Div,
Mod,
Pow,
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
And,
Or,
}