use front::ast::FGrammar;
use middle::analysis::ast::*;
use middle::analysis::duplicate::*;
use middle::analysis::resolve_non_terminal::*;
use middle::analysis::well_formedness::*;
use middle::analysis::attribute::*;
use middle::analysis::useless_chaining::*;
mod duplicate;
mod resolve_non_terminal;
mod well_formedness;
mod attribute;
mod useless_chaining;
pub mod ast;
pub fn analyse(fgrammar: FGrammar) -> Partial<AGrammar> {
let grammar = AGrammar::new(fgrammar.start_span, fgrammar.exprs, fgrammar.exprs_info);
let frust_items = fgrammar.rust_items;
let fattributes = fgrammar.attributes;
rule_duplicate(grammar, fgrammar.rules)
.and_then(|grammar| rust_functions_duplicate(grammar, frust_items))
.and_then(|grammar| ResolveNonTerminal::resolve(grammar))
.and_then(|grammar| WellFormedness::analyse(grammar))
.and_then(|grammar| UselessChaining::analyse(grammar))
.and_then(|grammar| decorate_with_attributes(grammar, fattributes))
}