1 package org.simantics.scl.compiler.parser.grammar;
3 import org.simantics.scl.compiler.parser.regexp.Namer;
5 public class Grammar implements Namer {
6 public final Production[] productions;
7 public final String[] terminalNames;
8 public final String[] nonterminalNames;
9 public final int[] initialNonterminals;
11 public Grammar(Production[] productions, String[] terminalNames,
12 String[] nonterminalNames, int[] initialNonterminals) {
13 this.productions = productions;
14 this.terminalNames = terminalNames;
15 this.nonterminalNames = nonterminalNames;
16 this.initialNonterminals = initialNonterminals;
19 public String getName(int symbolId) {
21 return terminalNames[symbolId];
23 return nonterminalNames[~symbolId];
27 public String toString() {
28 StringBuilder b = new StringBuilder();
29 for(Production prod : productions) {
30 b.append(prod.toString(this));
33 /*for(int i=0;i<terminalNames.length;++i)
34 b.append(terminalNames[i]).append(' ').append(i).append('\n');*/
39 int[] prodCount = new int[nonterminalNames.length];
40 for(Production prod : productions)
41 ++prodCount[~prod.lhs];
42 for(int i=0;i<nonterminalNames.length;++i)
44 System.err.println("Nonterminal " + nonterminalNames[i] + " does not have productions.");