1 package org.simantics.scl.compiler.parser.grammar;
3 import org.simantics.scl.compiler.parser.regexp.Namer;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
7 public class Grammar implements Namer {
8 private static final Logger LOGGER = LoggerFactory.getLogger(Grammar.class);
9 public final Production[] productions;
10 public final String[] terminalNames;
11 public final String[] nonterminalNames;
12 public final int[] initialNonterminals;
14 public Grammar(Production[] productions, String[] terminalNames,
15 String[] nonterminalNames, int[] initialNonterminals) {
16 this.productions = productions;
17 this.terminalNames = terminalNames;
18 this.nonterminalNames = nonterminalNames;
19 this.initialNonterminals = initialNonterminals;
22 public String getName(int symbolId) {
24 return terminalNames[symbolId];
26 return nonterminalNames[~symbolId];
30 public String toString() {
31 StringBuilder b = new StringBuilder();
32 for(Production prod : productions) {
33 b.append(prod.toString(this));
36 /*for(int i=0;i<terminalNames.length;++i)
37 b.append(terminalNames[i]).append(' ').append(i).append('\n');*/
42 int[] prodCount = new int[nonterminalNames.length];
43 for(Production prod : productions)
44 ++prodCount[~prod.lhs];
45 for(int i=0;i<nonterminalNames.length;++i)
47 LOGGER.error("Nonterminal " + nonterminalNames[i] + " does not have productions.");