improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / util / MementoTokenizer.java
1 /*******************************************************************************
2  * Copyright (c) 2004 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials 
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  * 
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpdt.internal.core.util;
12
13 import net.sourceforge.phpdt.core.compiler.CharOperation;
14 import net.sourceforge.phpdt.internal.core.JavaElement;
15
16 public class MementoTokenizer {
17         private static final String COUNT = Character.toString(JavaElement.JEM_COUNT);
18         private static final String JAVAPROJECT = Character.toString(JavaElement.JEM_JAVAPROJECT);
19         private static final String PACKAGEFRAGMENTROOT = Character.toString(JavaElement.JEM_PACKAGEFRAGMENTROOT);
20         private static final String PACKAGEFRAGMENT = Character.toString(JavaElement.JEM_PACKAGEFRAGMENT);
21         private static final String FIELD = Character.toString(JavaElement.JEM_FIELD);
22         private static final String METHOD = Character.toString(JavaElement.JEM_METHOD);
23         private static final String INITIALIZER = Character.toString(JavaElement.JEM_INITIALIZER);
24         private static final String COMPILATIONUNIT = Character.toString(JavaElement.JEM_COMPILATIONUNIT);
25 //      private static final String CLASSFILE = Character.toString(JavaElement.JEM_CLASSFILE);
26         private static final String TYPE = Character.toString(JavaElement.JEM_TYPE);
27         private static final String PACKAGEDECLARATION = Character.toString(JavaElement.JEM_PACKAGEDECLARATION);
28         private static final String IMPORTDECLARATION = Character.toString(JavaElement.JEM_IMPORTDECLARATION);
29         private static final String LOCALVARIABLE = Character.toString(JavaElement.JEM_LOCALVARIABLE);
30
31         private final char[] memento;
32         private final int length;
33         private int index = 0;
34         
35         public MementoTokenizer(String memento) {
36                 this.memento = memento.toCharArray();
37                 this.length = this.memento.length;
38         }
39         
40         public boolean hasMoreTokens() {
41                 return this.index < this.length;
42         }
43         
44         public String nextToken() {
45                 int start = this.index;
46                 StringBuffer buffer = null;
47                 switch (this.memento[this.index++]) {
48                         case JavaElement.JEM_ESCAPE:
49                                 buffer = new StringBuffer();
50                                 buffer.append(this.memento[this.index]);
51                                 start = ++this.index;
52                                 break;
53                         case JavaElement.JEM_COUNT:
54                                 return COUNT;
55                         case JavaElement.JEM_JAVAPROJECT:
56                                 return JAVAPROJECT;
57                         case JavaElement.JEM_PACKAGEFRAGMENTROOT:
58                                 return PACKAGEFRAGMENTROOT;
59                         case JavaElement.JEM_PACKAGEFRAGMENT:
60                                 return PACKAGEFRAGMENT;
61                         case JavaElement.JEM_FIELD:
62                                 return FIELD;
63                         case JavaElement.JEM_METHOD:
64                                 return METHOD;
65                         case JavaElement.JEM_INITIALIZER:
66                                 return INITIALIZER;
67                         case JavaElement.JEM_COMPILATIONUNIT:
68                                 return COMPILATIONUNIT;
69 //                      case JavaElement.JEM_CLASSFILE:
70 //                              return CLASSFILE;
71                         case JavaElement.JEM_TYPE:
72                                 return TYPE;
73                         case JavaElement.JEM_PACKAGEDECLARATION:
74                                 return PACKAGEDECLARATION;
75                         case JavaElement.JEM_IMPORTDECLARATION:
76                                 return IMPORTDECLARATION;
77                         case JavaElement.JEM_LOCALVARIABLE:
78                                 return LOCALVARIABLE;
79                 }
80                 loop: while (this.index < this.length) {
81                         switch (this.memento[this.index]) {
82                                 case JavaElement.JEM_ESCAPE:
83                                         if (buffer == null) buffer = new StringBuffer();
84                                         buffer.append(CharOperation.subarray(this.memento, start, this.index));
85                                         start = ++this.index;
86                                         break;
87                                 case JavaElement.JEM_COUNT:
88                                 case JavaElement.JEM_JAVAPROJECT:
89                                 case JavaElement.JEM_PACKAGEFRAGMENTROOT:
90                                 case JavaElement.JEM_PACKAGEFRAGMENT:
91                                 case JavaElement.JEM_FIELD:
92                                 case JavaElement.JEM_METHOD:
93                                 case JavaElement.JEM_INITIALIZER:
94                                 case JavaElement.JEM_COMPILATIONUNIT:
95 //                              case JavaElement.JEM_CLASSFILE:
96                                 case JavaElement.JEM_TYPE:
97                                 case JavaElement.JEM_PACKAGEDECLARATION:
98                                 case JavaElement.JEM_IMPORTDECLARATION:
99                                 case JavaElement.JEM_LOCALVARIABLE:
100                                         break loop;
101                         }
102                         this.index++;
103                 }
104                 if (buffer != null) {
105                         buffer.append(CharOperation.subarray(this.memento, start, this.index));
106                         return buffer.toString();
107                 } else {
108                         return new String(CharOperation.subarray(this.memento, start, this.index));
109                 }
110         }
111         
112 }