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 }