grammar-utils 0.2.0

A library for working with context-free grammars.
Documentation
use crate::*;
use crate::lr1::*;

#[test]
fn test_conflicts() {
    let grammar = grammar! {
        S -> E;
        E -> T plus E;
        E -> T;
        T -> F times T;
        T -> F;
        F -> id;
        F -> lparen E rparen;
    };

    let table = ParseTable::build(&grammar, grammar.rules()[0]);
    dbg!(&table.states().len());
    dbg!(table.conflicts());
    for conflict in table.conflicts() {
        eprintln!("{conflict:?}");
        eprintln!("{:?}", conflict.state());
        eprintln!();
    }
    assert_eq!(table.conflicts().len(), 0);
}

#[test]
fn test_machine() {
    let grammar = grammar! {
        S -> E;
        E -> T plus E;
        E -> T;
        T -> F times T;
        T -> F;
        F -> id;
        F -> lparen E rparen;
    };

    let table = ParseTable::build(&grammar, grammar.rules()[0]);
    table.dump();
    let mut input = [
        grammar.symbol("id").unwrap(),
        grammar.symbol("plus").unwrap(),
        grammar.symbol("id").unwrap(),
        grammar.symbol("times").unwrap(),
        grammar.symbol("lparen").unwrap(),
        grammar.symbol("id").unwrap(),
        grammar.symbol("plus").unwrap(),
        grammar.symbol("id").unwrap(),
        grammar.symbol("rparen").unwrap(),
    ].into_iter();
    let mut machine = Machine::new(&table, &mut input);
    machine.run();
}

#[test]
fn test_conflicts2() {
    let grammar = grammar! {
        start -> command;
        command -> write data to   file;
        command -> write file from data;
        command -> read  data from file;
        command -> read  file to   data;
        file -> identifier;
        data -> identifier;
    };

    let table = ParseTable::build(&grammar, grammar.rules()[0]);
    table.dump();
    assert_eq!(table.conflicts().len(), 0);

    let table2 = crate::lr0::ParseTable::build(&grammar, grammar.rules()[0]);
    assert!(table2.conflicts().len() > 0);
}