pub use ast::*;
pub struct FGrammar
{
pub start_span: Span,
pub rules: Vec<Rule>,
pub exprs: Vec<Expression>,
pub exprs_info: Vec<FExpressionInfo>,
pub rust_items: Vec<syn::Item>,
pub attributes: Vec<syn::Attribute>
}
impl FGrammar
{
pub fn new(start_span: Span) -> FGrammar {
FGrammar {
start_span,
rules: vec![],
exprs: vec![],
exprs_info: vec![],
rust_items: vec![],
attributes: vec![]
}
}
pub fn alloc_expr(&mut self, span: Span, expr: Expression) -> usize {
let expr_idx = self.exprs.len();
self.exprs.push(expr);
self.exprs_info.push(FExpressionInfo::spanned(span));
expr_idx
}
pub fn push_rule(&mut self, name: Ident, def: usize) {
self.rules.push(Rule::new(name, def));
}
pub fn push_attrs(&mut self, attrs: Vec<syn::Attribute>) {
self.attributes.extend(attrs.into_iter());
}
pub fn push_rust_item(&mut self, ritem: syn::Item) {
self.rust_items.push(ritem);
}
}
#[derive(Clone)]
pub struct FExpressionInfo
{
pub span: Span
}
impl FExpressionInfo
{
fn spanned(span: Span) -> FExpressionInfo {
FExpressionInfo { span }
}
}
impl Spanned for FExpressionInfo {
fn span(&self) -> Span {
self.span
}
}