use crate::{MixOp, SpecTecDefTyp, SpecTecExp, SpecTecPrem, SpecTecSym, SpecTecTyp};
use decode_derive::SExprDecode;
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecArg {
#[sexpr_node(name = "exp")]
Exp { e: SpecTecExp },
#[sexpr_node(name = "typ")]
Typ { t: SpecTecTyp },
#[sexpr_node(name = "def")]
Def { x: String },
#[sexpr_node(name = "gram")]
Gram { g: SpecTecSym },
}
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecBind {
#[sexpr_node(name = "exp")]
Exp { x: String, t: SpecTecTyp },
#[sexpr_node(name = "typ")]
Typ { x: String },
#[sexpr_node(name = "def")]
Def {
x: String,
ps: Vec<SpecTecParam>,
t: SpecTecTyp,
},
#[sexpr_node(name = "gram")]
Gram {
x: String,
ps: Vec<SpecTecParam>,
t: SpecTecTyp,
},
}
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecParam {
#[sexpr_node(name = "exp")]
Exp { x: String, t: SpecTecTyp },
#[sexpr_node(name = "typ")]
Typ { x: String },
#[sexpr_node(name = "def")]
Def {
x: String,
ps: Vec<SpecTecParam>,
t: SpecTecTyp,
},
#[sexpr_node(name = "gram")]
Gram { x: String, t: SpecTecTyp },
}
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecInst {
#[sexpr_node(name = "inst")]
Inst {
bs: Vec<SpecTecBind>,
as_: Vec<SpecTecArg>,
dt: SpecTecDefTyp,
},
}
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecRule {
#[sexpr_node(name = "rule")]
Rule {
x: String,
bs: Vec<SpecTecBind>,
op: MixOp,
e: SpecTecExp,
prs: Vec<SpecTecPrem>,
},
}
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecClause {
#[sexpr_node(name = "clause")]
Clause {
bs: Vec<SpecTecBind>,
as_: Vec<SpecTecArg>,
e: SpecTecExp,
prs: Vec<SpecTecPrem>,
},
}
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecProd {
#[sexpr_node(name = "prod")]
Prod {
bs: Vec<SpecTecBind>,
g: SpecTecSym,
e: SpecTecExp,
prs: Vec<SpecTecPrem>,
},
}
#[allow(unused)]
#[derive(SExprDecode, Debug, PartialEq)]
pub enum SpecTecDef {
#[sexpr_node(name = "typ")]
Typ {
x: String,
ps: Vec<SpecTecParam>,
insts: Vec<SpecTecInst>,
},
#[sexpr_node(name = "rel")]
Rel {
x: String,
op: MixOp,
t: SpecTecTyp,
rules: Vec<SpecTecRule>,
},
#[sexpr_node(name = "def")]
Dec {
x: String,
ps: Vec<SpecTecParam>,
t: SpecTecTyp,
clauses: Vec<SpecTecClause>,
},
#[sexpr_node(name = "gram")]
Gram {
x: String,
ps: Vec<SpecTecParam>,
t: SpecTecTyp,
prods: Vec<SpecTecProd>,
},
#[sexpr_node(name = "rec")]
Rec { ds: Vec<SpecTecDef> },
}