1 8 9 package beaver.spec; 10 11 import beaver.comp.util.BitSet; 12 13 16 public class Grammar 17 { 18 static public class Exception extends java.lang.Exception 19 { 20 public Exception(String msg) 21 { 22 super(msg); 23 } 24 } 25 26 static public final String EBNF_LIST_TYPE = "java.util.ArrayList"; 27 static public final String EBNF_LIST_TYPE_NAME = EBNF_LIST_TYPE.substring(EBNF_LIST_TYPE.lastIndexOf('.') + 1); 28 29 30 public String prolog; 31 32 33 public String package_name; 34 35 36 public String [] imports; 37 38 39 public String class_name; 40 41 42 public String class_code; 43 44 45 public String init_code; 46 47 48 public Terminal[] terminals; 49 50 51 public NonTerminal[] nonterminals; 52 53 54 public Production[] rules; 55 56 57 public NonTerminal goal_symbol; 58 59 60 public Terminal eof; 61 62 63 public NonTerminal error; 64 65 Grammar() 66 { 67 eof = new Terminal("EOF"); 68 error = new NonTerminal("error"); 69 } 70 71 public void markNullableProductions() 72 { 73 boolean changed; 74 do 75 { 76 changed = false; 77 78 for (int i = 0; i < nonterminals.length; i++) 79 { 80 if (nonterminals[i].checkNullability()) 81 { 82 changed = true; 83 } 84 } 85 } 86 while (changed); 87 } 88 89 95 public void buildFirstSets() 96 { 97 for (int i = 0; i < nonterminals.length; i++) 98 { 99 nonterminals[i].first_set = new BitSet(terminals.length); 100 } 101 for (int i = 0; i < rules.length; i++) 102 { 103 rules[i].startFirstSet(); 104 } 105 boolean modified; 106 do 107 { 108 modified = false; 109 110 for (int i = 0; i < rules.length; i++) 111 { 112 if (rules[i].extendFirstSet()) 113 { 114 modified = true; 115 } 116 } 117 } 118 while (modified); 119 } 120 } 121 | Popular Tags |