]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/grammar/Grammar.java
Replace System.err and System.out with SLF4J Logging
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / parser / grammar / Grammar.java
1 package org.simantics.scl.compiler.parser.grammar;
2
3 import org.simantics.scl.compiler.parser.regexp.Namer;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6
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;
13     
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;
20     }
21
22     public String getName(int symbolId) {
23         if(symbolId >= 0)
24             return terminalNames[symbolId];
25         else
26             return nonterminalNames[~symbolId];
27     }
28     
29     @Override
30     public String toString() {
31         StringBuilder b = new StringBuilder();
32         for(Production prod : productions) {
33             b.append(prod.toString(this));
34             b.append("\n");
35         }
36         /*for(int i=0;i<terminalNames.length;++i)
37             b.append(terminalNames[i]).append(' ').append(i).append('\n');*/
38         return b.toString();
39     }
40
41     public void check() {
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)
46             if(prodCount[i]==0)
47                 LOGGER.error("Nonterminal " + nonterminalNames[i] + " does not have productions.");
48     }
49 }