use sim_kernel::{Diagnostic, Expr, Symbol};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Production {
Terminal(TerminalAtom),
Seq(Vec<Production>),
Alt(Vec<Production>),
Repeat {
inner: Box<Production>,
at_least: usize,
},
Call {
head: Box<Production>,
args: Vec<Production>,
},
Ref(Symbol),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum TerminalAtom {
Any,
Symbol,
String,
Number,
Bool,
Nil,
List,
Map,
Exact(Expr),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GrammarGraph {
pub root: Production,
pub defs: Vec<(Symbol, Production)>,
pub diagnostics: Vec<Diagnostic>,
}
impl GrammarGraph {
pub fn new(root: Production) -> Self {
Self {
root,
defs: Vec::new(),
diagnostics: Vec::new(),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum GrammarDialect {
JsonSchema,
Gbnf,
SExpr,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum GrammarPosition {
Eval,
Quote,
Data,
Pattern,
Surface,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GrammarTarget {
pub codec: Symbol,
pub dialect: GrammarDialect,
pub position: GrammarPosition,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ShapeGrammar {
pub target: GrammarTarget,
pub graph: GrammarGraph,
pub text: String,
pub diagnostics: Vec<Diagnostic>,
}