tribble2/
tribble2.rs

1// Copyright (c) 2018 Fabian Schuiki
2extern crate perplex;
3
4// use std::fs::File;
5
6use perplex::grammar::{Grammar, Rule};
7use perplex::item_set::ItemSets;
8// use perplex::machine::StateMachine;
9// use perplex::backend::{generate_parser, Backend};
10
11#[allow(non_snake_case)]
12fn main() {
13    // Build the grammar in David Tribble's example 1.
14    let mut g = Grammar::new();
15    let ntExpr = g.add_nonterminal("Expr");
16    let ntFactor = g.add_nonterminal("Factor");
17    let tnum = g.add_terminal("num");
18    let tlpar = g.add_terminal("'('");
19    let trpar = g.add_terminal("')'");
20    let tplus = g.add_terminal("'+'");
21    g.add_rule(Rule::new(ntExpr, vec![ntFactor.into()]));
22    g.add_rule(Rule::new(
23        ntExpr,
24        vec![tlpar.into(), ntExpr.into(), trpar.into()],
25    ));
26    g.add_rule(Rule::new(ntFactor, vec![tnum.into()]));
27    g.add_rule(Rule::new(ntFactor, vec![tplus.into(), ntFactor.into()]));
28    g.add_rule(Rule::new(
29        ntFactor,
30        vec![ntFactor.into(), tplus.into(), tnum.into()],
31    ));
32
33    // Compute the item sets for the grammar.
34    let is = ItemSets::compute(&g);
35    println!("{}", is.pretty(&g));
36
37    // Generate the parser code.
38    // let sm = StateMachine::try_from(&is).unwrap();
39    // let backend = Backend::new();
40    // generate_parser(
41    //     &mut File::create("tests/generated/tribble2_parser.rs").unwrap(),
42    //     &backend,
43    //     &sm,
44    //     &g,
45    // ).unwrap();
46}