KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > emf > importer > rose > parser > RoseLexer


1 /**
2  * <copyright>
3  *
4  * Copyright (c) 2002-2004 IBM Corporation and others.
5  * All rights reserved. This program and the accompanying materials
6  * are made available under the terms of the Eclipse Public License v1.0
7  * which accompanies this distribution, and is available at
8  * http://www.eclipse.org/legal/epl-v10.html
9  *
10  * Contributors:
11  * IBM - Initial API and implementation
12  *
13  * </copyright>
14  *
15  * $Id: RoseLexer.java,v 1.2 2005/06/08 06:20:36 nickb Exp $
16  */

17 package org.eclipse.emf.importer.rose.parser;
18
19 import java.util.ArrayList JavaDoc;
20 import java.util.List JavaDoc;
21 import java.util.StringTokenizer JavaDoc;
22
23
24 /**
25  * A lexical analyzer that creates vector of tokens out of Rose file.
26  */

27 public class RoseLexer
28 {
29   protected RoseLoader roseLoader;
30   protected List JavaDoc tokens = new ArrayList JavaDoc();
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 JavaDoc 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 JavaDoc stringTokenizer = new StringTokenizer JavaDoc(currentLine);
133       for (int i = 0; stringTokenizer.hasMoreTokens();)
134       {
135         String JavaDoc 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(); // 7 is the size of (object
151
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(); // 5 is the size of (list
164
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(); // 6 is the size of (value
177
processValueToTheEnd(currentLine, lineCounter);
178           break;
179         }
180         else if (i == 0 && tok.charAt(0) == ')')
181         {
182           int rightParenNum = 0;
183           String JavaDoc 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 JavaDoc 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 JavaDoc 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       // Only one open quote.
265
//
266
String JavaDoc 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 JavaDoc 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 JavaDoc firstWord = temp;
321     String JavaDoc 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