1 20 21 package JFlex; 22 23 import java.util.*; 24 25 26 35 final public class Macros { 36 37 38 private Hashtable macros; 39 40 41 private Hashtable used; 42 43 44 47 public Macros() { 48 macros = new Hashtable(); 49 used = new Hashtable(); 50 } 51 52 53 62 public boolean insert(String name, RegExp definition) { 63 64 if (Options.DEBUG) 65 Out.debug("inserting macro "+name+" with definition :"+Out.NL+definition); 67 used.put(name, Boolean.FALSE); 68 return macros.put(name,definition) == null; 69 } 70 71 72 78 public boolean markUsed(String name) { 79 return used.put(name, Boolean.TRUE) != null; 80 } 81 82 83 89 public boolean isUsed(String name) { 90 return ((Boolean )used.get(name)).booleanValue(); 91 } 92 93 94 99 public Enumeration unused() { 100 101 Vector unUsed = new Vector(); 102 103 Enumeration names = used.keys(); 104 while ( names.hasMoreElements() ) { 105 String name = (String ) names.nextElement(); 106 Boolean isUsed = (Boolean ) used.get( name ); 107 if ( !isUsed.booleanValue() ) unUsed.addElement(name); 108 } 109 110 return unUsed.elements(); 111 } 112 113 114 128 public RegExp getDefinition(String name) { 129 return (RegExp) macros.get(name); 130 } 131 132 133 139 public void expand() throws MacroException { 140 141 Enumeration names; 142 143 names = macros.keys(); 144 145 while ( names.hasMoreElements() ) { 146 String name = (String ) names.nextElement(); 147 if ( isUsed(name) ) 148 macros.put(name, expandMacro(name, getDefinition(name))); 149 } 153 } 154 155 156 168 private RegExp expandMacro(String name, RegExp definition) throws MacroException { 169 170 173 switch ( definition.type ) { 174 case sym.BAR: 175 case sym.CONCAT: 176 RegExp2 binary = (RegExp2) definition; 177 binary.r1 = expandMacro(name, binary.r1); 178 binary.r2 = expandMacro(name, binary.r2); 179 return definition; 180 181 case sym.STAR: 182 case sym.PLUS: 183 case sym.QUESTION: 184 case sym.BANG: 185 case sym.TILDE: 186 RegExp1 unary = (RegExp1) definition; 187 unary.content = expandMacro(name, (RegExp) unary.content); 188 return definition; 189 190 case sym.MACROUSE: 191 String usename = (String ) ((RegExp1) definition).content; 192 193 if ( name.equals(usename) ) 194 throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_CYCLE, name)); 195 196 RegExp usedef = getDefinition(usename); 197 198 if ( usedef == null ) 199 throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_DEF_MISSING, usename, name)); 200 201 markUsed(usename); 202 203 return expandMacro(name, usedef); 204 205 case sym.STRING: 206 case sym.STRING_I: 207 case sym.CHAR: 208 case sym.CHAR_I: 209 case sym.CCLASS: 210 case sym.CCLASSNOT: 211 return definition; 212 213 default: 214 throw new MacroException("unknown expression type "+definition.type+" in macro expansion"); } 216 } 217 } 218 | Popular Tags |