1 module gamma.grammar.Grammar;
2 
3 import gamma.grammar.Nonterminal;
4 import gamma.grammar.Rule;
5 import gamma.grammar.Terminal;
6 import gamma.grammar.Visitor;
7 
8 public class Grammar
9 {
10     private Nonterminal[] nonterminals_;
11 
12     private Terminal[] terminals_;
13 
14     private Rule[] rules_;
15 
16     private Nonterminal startSymbol_;
17 
18     public this(Nonterminal[] nonterminals, Terminal[] terminals, Rule[] rules, Nonterminal startSymbol)
19     {
20         this.nonterminals_ = nonterminals.dup;
21         this.terminals_ = terminals.dup;
22         this.rules_ = rules.dup;
23         this.startSymbol_ = startSymbol;
24     }
25 
26     public void accept(Visitor visitor)
27     {
28         visitor.visit(this);
29     }
30 
31     public Nonterminal[] nonterminals()
32     {
33         return this.nonterminals_;
34     }
35 
36     public Terminal[] terminals()
37     {
38         return this.terminals_;
39     }
40 
41     public Rule[] rules()
42     {
43         return this.rules_;
44     }
45 
46     public Nonterminal startSymbol()
47     {
48         return this.startSymbol_;
49     }
50 
51     public Nonterminal nonterminal(size_t index)
52     {
53         return this.nonterminals_[index];
54     }
55 
56     public Terminal terminal(size_t index)
57     {
58         return this.terminals_[index];
59     }
60 
61     public Rule ruleOf(Nonterminal nonterminal)
62     {
63         return this.rules_[nonterminal.index];
64     }
65 }