1 17 package org.eclipse.emf.importer.rose.parser; 18 19 import java.util.ArrayList ; 20 import java.util.List ; 21 import java.util.StringTokenizer ; 22 23 24 27 public class RoseLexer 28 { 29 protected RoseLoader roseLoader; 30 protected List tokens = new ArrayList (); 31 protected int currentElement = 0; 32 protected boolean isList = false; 33 protected int lineCounter = 0; 34 35 public RoseLexer(RoseLoader roseLoader) 36 { 37 this.roseLoader = roseLoader; 38 } 39 40 protected void getNextBlock() 41 { 42 RoseToken roseToken = null; 43 if (tokens.size() > currentElement) 44 { 45 roseToken = (RoseToken)tokens.get(currentElement); 46 } 47 tokens.clear(); 48 if (roseToken != null) 49 { 50 tokens.add(roseToken); 51 } 52 currentElement = 0; 53 System.gc(); 54 readLines(); 55 } 56 57 public RoseToken getNext() 58 { 59 if (currentElement >= tokens.size()) 60 { 61 getNextBlock(); 62 } 63 if (currentElement < tokens.size()) 64 { 65 RoseToken roseToken = (RoseToken)tokens.get(currentElement); 66 currentElement++; 67 return roseToken; 68 } 69 else 70 { 71 return null; 72 } 73 } 74 75 public RoseToken peekNext() 76 { 77 if (currentElement >= tokens.size()) 78 { 79 getNextBlock(); 80 } 81 if (currentElement < tokens.size()) 82 { 83 return (RoseToken)tokens.get(currentElement); 84 } 85 else 86 { 87 return null; 88 } 89 } 90 91 public void printNeighbors() 92 { 93 int count = 100; 94 if (currentElement < 100) 95 { 96 count = currentElement; 97 } 98 for (int i = currentElement - count; i <= currentElement; i++) 99 { 100 RoseToken tok = (RoseToken)tokens.get(i); 101 System.out.println(tok.getToken()); 102 } 103 } 104 105 public void readLines() 106 { 107 for (int k = 0; k < 1000; k++) 108 { 109 String currentLine = roseLoader.readLine(); 110 if (currentLine == null) 111 { 112 return; 113 } 114 lineCounter++; 115 if (currentLine.length() == 0) 116 { 117 k--; 118 continue; 119 } 120 if (currentLine.charAt(0) == '|') 121 { 122 RoseToken roseToken = new RoseToken(RoseToken.VERTICAL_BAR, ""); 123 roseToken.lineNum = lineCounter; 124 125 tokens.add(roseToken); 126 currentLine = currentLine.substring(1); 127 roseToken = new RoseToken(RoseToken.STRING, currentLine); 128 roseToken.lineNum = lineCounter; 129 tokens.add(roseToken); 130 continue; 131 } 132 StringTokenizer stringTokenizer = new StringTokenizer (currentLine); 133 for (int i = 0; stringTokenizer.hasMoreTokens();) 134 { 135 String tok = stringTokenizer.nextToken(); 136 if (tok.equals("#")) 137 { 138 break; 139 } 140 currentLine = currentLine.substring(currentLine.indexOf(tok)); 141 if (tok.equals("(object")) 142 { 143 isList = false; 144 RoseToken roseToken = new RoseToken(RoseToken.LEFT_PAREN, ""); 145 roseToken.lineNum = lineCounter; 146 tokens.add(roseToken); 147 roseToken = new RoseToken(RoseToken.OBJECT, ""); 148 roseToken.lineNum = lineCounter; 149 tokens.add(roseToken); 150 currentLine = currentLine.substring(7).trim(); processToTheEnd(currentLine, lineCounter); 152 break; 153 } 154 else if (tok.equals("(list")) 155 { 156 isList = true; 157 RoseToken roseToken = new RoseToken(RoseToken.LEFT_PAREN, ""); 158 roseToken.lineNum = lineCounter; 159 tokens.add(roseToken); 160 roseToken = new RoseToken(RoseToken.LIST, ""); 161 roseToken.lineNum = lineCounter; 162 tokens.add(roseToken); 163 currentLine = currentLine.substring(5).trim(); processToTheEnd(currentLine, lineCounter); 165 break; 166 } 167 else if (tok.equals("(value")) 168 { 169 isList = false; 170 RoseToken roseToken = new RoseToken(RoseToken.LEFT_PAREN, ""); 171 roseToken.lineNum = lineCounter; 172 tokens.add(roseToken); 173 roseToken = new RoseToken(RoseToken.VALUE, ""); 174 roseToken.lineNum = lineCounter; 175 tokens.add(roseToken); 176 currentLine = currentLine.substring(6).trim(); processValueToTheEnd(currentLine, lineCounter); 178 break; 179 } 180 else if (i == 0 && tok.charAt(0) == ')') 181 { 182 int rightParenNum = 0; 183 String temp = tok; 184 while (temp.length() > 0 && temp.charAt(temp.length() - 1) == ')') 185 { 186 rightParenNum++; 187 temp = temp.substring(0, temp.length() - 1); 188 } 189 for (int j = 0; j < rightParenNum; j++) 190 { 191 isList = false; 192 RoseToken roseToken = new RoseToken(RoseToken.RIGHT_PAREN, ""); 193 roseToken.lineNum = lineCounter; 194 tokens.add(roseToken); 195 } 196 break; 197 } 198 else 199 { 200 if (i == 0) 201 { 202 if (isList) 203 { 204 int rightParenNum = 0; 205 String temp = currentLine.trim(); 206 while (temp.charAt(temp.length() - 1) == ')') 207 { 208 rightParenNum++; 209 temp = temp.substring(0, temp.length() - 1); 210 } 211 if (currentLine.charAt(0) == '(') 212 { 213 rightParenNum--; 214 temp += ")"; 215 } 216 RoseToken roseToken = new RoseToken(RoseToken.STRING, temp); 217 roseToken.lineNum = lineCounter; 218 tokens.add(roseToken); 219 for (int j = 0; j < rightParenNum; j++) 220 { 221 isList = false; 222 roseToken = new RoseToken(RoseToken.RIGHT_PAREN, ""); 223 roseToken.lineNum = lineCounter; 224 tokens.add(roseToken); 225 } 226 break; 227 } 228 else 229 { 230 isList = false; 231 RoseToken roseToken = new RoseToken(RoseToken.KEY, tok); 232 roseToken.lineNum = lineCounter; 233 tokens.add(roseToken); 234 } 235 } 236 else 237 { 238 isList = false; 239 currentLine = currentLine.trim(); 240 processToTheEnd(currentLine, lineCounter); 241 break; 242 } 243 } 244 245 i++; 246 } 247 } 248 } 249 250 protected void processToTheEnd(String temp, int lineCounter) 251 { 252 if (temp.length() == 0) 253 { 254 RoseToken roseToken = new RoseToken(RoseToken.STRING, temp); 255 roseToken.lineNum = lineCounter; 256 tokens.add(roseToken); 257 return; 258 } 259 260 int indFirst = temp.indexOf("\""); 261 int indLast = temp.lastIndexOf("\""); 262 if (indFirst != -1 && indFirst == indLast) 263 { 264 String currentLine = roseLoader.readLine(); 267 temp += currentLine; 268 while (currentLine.indexOf("\"") == -1) 269 { 270 currentLine = roseLoader.readLine(); 271 temp += currentLine; 272 } 273 } 274 275 int rightParenNum = 0; 276 while (temp.charAt(temp.length() - 1) == ')') 277 { 278 rightParenNum++; 279 temp = temp.substring(0, temp.length() - 1); 280 } 281 282 if (temp.charAt(0) == '(') 283 { 284 rightParenNum--; 285 temp += ")"; 286 } 287 288 RoseToken roseToken = new RoseToken(RoseToken.STRING, temp); 289 roseToken.lineNum = lineCounter; 290 tokens.add(roseToken); 291 for (int i = 0; i < rightParenNum; i++) 292 { 293 isList = false; 294 roseToken = new RoseToken(RoseToken.RIGHT_PAREN, ""); 295 roseToken.lineNum = lineCounter; 296 tokens.add(roseToken); 297 } 298 } 299 300 protected void processValueToTheEnd(String temp, int lineCounter) 301 { 302 if (temp.length() == 0) 303 { 304 RoseToken roseToken = new RoseToken(RoseToken.STRING, temp); 305 roseToken.lineNum = lineCounter; 306 tokens.add(roseToken); 307 return; 308 } 309 int rightParenNum = 0; 310 while (temp.charAt(temp.length() - 1) == ')') 311 { 312 rightParenNum++; 313 temp = temp.substring(0, temp.length() - 1); 314 } 315 if (temp.charAt(0) == '(') 316 { 317 rightParenNum--; 318 temp += ")"; 319 } 320 String firstWord = temp; 321 String restOfString = ""; 322 int indexOfSpace = temp.indexOf(" "); 323 if (indexOfSpace == -1) 324 { 325 indexOfSpace = temp.indexOf("\t"); 326 } 327 if (indexOfSpace != -1) 328 { 329 firstWord = temp.substring(0, indexOfSpace); 330 restOfString = temp.substring(indexOfSpace).trim(); 331 } 332 333 RoseToken roseToken = new RoseToken(RoseToken.STRING, firstWord); 334 roseToken.lineNum = lineCounter; 335 tokens.add(roseToken); 336 if (restOfString.length() > 0) 337 { 338 roseToken = new RoseToken(RoseToken.STRING, restOfString); 339 roseToken.lineNum = lineCounter; 340 tokens.add(roseToken); 341 } 342 for (int i = 0; i < rightParenNum; i++) 343 { 344 isList = false; 345 roseToken = new RoseToken(RoseToken.RIGHT_PAREN, ""); 346 roseToken.lineNum = lineCounter; 347 tokens.add(roseToken); 348 } 349 } 350 } 351 | Popular Tags |