camxes-rs 1.1.1

Lojban PEG parser with semantic analysis - integrated camxes parser and tersmu semantic engine
Documentation
use camxes_rs::camxes::peg::grammar::Peg;
use camxes_rs::camxes::peg::semantic::{parse_with_semantics, span_slice, ReducerTable, SemanticNode};

fn main() {
    let input = format!("{} %%%END%%%", std::env::args().skip(1).collect::<Vec<_>>().join(" "));
    let (_, grammar) = camxes_rs::camxes::LOJBAN_GRAMMAR;
    let peg = Peg::new("text", grammar).unwrap();
    let mut reducers = ReducerTable::new();
    for rule in ["termset", "termsGikTerms", "terms", "terms_1", "terms_2", "term", "term_1", "sumti", "sumti_1", "sumti_2", "sumti_3", "sumti_4", "sumti_5", "gek_sentence", "gek", "gik", "tag", "stag", "tense_modal", "simple_tense_modal", "BAI_clause", "GI_clause", "subsentence", "sentence", "bridi_tail", "bridi_tail_3"] {
        reducers.on(rule, |name, span, children, input| {
            eprintln!("{} {:?}: {:?}", name, span, span_slice(input, span).trim());
            for child in children {
                if let SemanticNode::NonTerminal { name, span, value, .. } = child {
                    eprintln!("  child {} {:?} {:?} value={}", name, span, span_slice(input, *span).trim(), value.is_some());
                }
            }
            None::<String>
        });
    }
    let _ = parse_with_semantics(&peg, &input, &reducers).unwrap();
}