KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > syntax > jedit > tokenmarker > EiffelTokenMarker


1 /*
2  * Copyright (C) 2005 - 2006 JasperSoft Corporation. All rights reserved.
3  * http://www.jaspersoft.com.
4  *
5  * Unless you have purchased a commercial license agreement from JasperSoft,
6  * the following license terms apply:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  *
12  * This program is distributed WITHOUT ANY WARRANTY; and without the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
18  * or write to:
19  *
20  * Free Software Foundation, Inc.,
21  * 59 Temple Place - Suite 330,
22  * Boston, MA USA 02111-1307
23  *
24  *
25  *
26  *
27  * EiffelTokenMarker.java
28  *
29  */

30
31 package org.syntax.jedit.tokenmarker;
32
33 import org.syntax.jedit.*;
34 import javax.swing.text.Segment JavaDoc;
35
36 /**
37  * Eiffel token Marker.
38  *
39  * @author Artur Biesiadowski
40  */

41 public class EiffelTokenMarker extends TokenMarker
42 {
43
44     public EiffelTokenMarker()
45     {
46         this.keywords = getKeywords();
47     }
48
49     public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex)
50     {
51         char[] array = line.array;
52         int offset = line.offset;
53         lastOffset = offset;
54         lastKeyword = offset;
55         int length = line.count + offset;
56         boolean backslash = false;
57
58 loop: for(int i = offset; i < length; i++)
59         {
60             int i1 = (i+1);
61
62             char c = array[i];
63             if(c == '%')
64             {
65                 backslash = !backslash;
66                 continue;
67             }
68
69             switch(token)
70             {
71             case Token.NULL:
72                 switch(c)
73                 {
74                 case '"':
75                     doKeyword(line,i,c);
76                     if(backslash)
77                         backslash = false;
78                     else
79                     {
80                         addToken(i - lastOffset,token);
81                         token = Token.LITERAL1;
82                         lastOffset = lastKeyword = i;
83                     }
84                     break;
85                 case '\'':
86                     doKeyword(line,i,c);
87                     if(backslash)
88                         backslash = false;
89                     else
90                     {
91                         addToken(i - lastOffset,token);
92                         token = Token.LITERAL2;
93                         lastOffset = lastKeyword = i;
94                     }
95                     break;
96                 case ':':
97                     if(lastKeyword == offset)
98                     {
99                         if(doKeyword(line,i,c))
100                             break;
101                         backslash = false;
102                         addToken(i1 - lastOffset,Token.LABEL);
103                         lastOffset = lastKeyword = i1;
104                     }
105                     else if(doKeyword(line,i,c))
106                         break;
107                     break;
108                 case '-':
109                     backslash = false;
110                     doKeyword(line,i,c);
111                     if(length - i > 1)
112                     {
113                         switch(array[i1])
114                         {
115                         case '-':
116                             addToken(i - lastOffset,token);
117                             addToken(length - i,Token.COMMENT1);
118                             lastOffset = lastKeyword = length;
119                             break loop;
120                         }
121                     }
122                     break;
123                 default:
124                     backslash = false;
125                     if(!Character.isLetterOrDigit(c)
126                         && c != '_')
127                         doKeyword(line,i,c);
128                     break;
129                 }
130                 break;
131             case Token.COMMENT1:
132             case Token.COMMENT2:
133                 throw new RuntimeException JavaDoc("Wrong eiffel parser state");
134             case Token.LITERAL1:
135                 if(backslash)
136                     backslash = false;
137                 else if(c == '"')
138                 {
139                     addToken(i1 - lastOffset,token);
140                     token = Token.NULL;
141                     lastOffset = lastKeyword = i1;
142                 }
143                 break;
144             case Token.LITERAL2:
145                 if(backslash)
146                     backslash = false;
147                 else if(c == '\'')
148                 {
149                     addToken(i1 - lastOffset,Token.LITERAL1);
150                     token = Token.NULL;
151                     lastOffset = lastKeyword = i1;
152                 }
153                 break;
154             default:
155                 throw new InternalError JavaDoc("Invalid state: "
156                     + token);
157             }
158         }
159
160         if(token == Token.NULL)
161             doKeyword(line,length,'\0');
162
163         switch(token)
164         {
165         case Token.LITERAL1:
166         case Token.LITERAL2:
167             addToken(length - lastOffset,Token.INVALID);
168             token = Token.NULL;
169             break;
170         case Token.KEYWORD2:
171             addToken(length - lastOffset,token);
172             if(!backslash)
173                 token = Token.NULL;
174         default:
175             addToken(length - lastOffset,token);
176             break;
177         }
178
179         return token;
180     }
181
182     public static KeywordMap getKeywords()
183     {
184         if(eiffelKeywords == null)
185         {
186             eiffelKeywords = new KeywordMap(true);
187             eiffelKeywords.add("alias", Token.KEYWORD1);
188             eiffelKeywords.add("all", Token.KEYWORD1);
189             eiffelKeywords.add("and", Token.KEYWORD1);
190             eiffelKeywords.add("as", Token.KEYWORD1);
191             eiffelKeywords.add("check", Token.KEYWORD1);
192             eiffelKeywords.add("class", Token.KEYWORD1);
193             eiffelKeywords.add("creation", Token.KEYWORD1);
194             eiffelKeywords.add("debug", Token.KEYWORD1);
195             eiffelKeywords.add("deferred", Token.KEYWORD1);
196             eiffelKeywords.add("do", Token.KEYWORD1);
197             eiffelKeywords.add("else",Token.KEYWORD1);
198             eiffelKeywords.add("elseif", Token.KEYWORD1);
199             eiffelKeywords.add("end", Token.KEYWORD1);
200             eiffelKeywords.add("ensure", Token.KEYWORD1);
201             eiffelKeywords.add("expanded", Token.KEYWORD1);
202             eiffelKeywords.add("export", Token.KEYWORD1);
203             eiffelKeywords.add("external", Token.KEYWORD1);
204             eiffelKeywords.add("feature", Token.KEYWORD1);
205             eiffelKeywords.add("from", Token.KEYWORD1);
206             eiffelKeywords.add("frozen", Token.KEYWORD1);
207             eiffelKeywords.add("if", Token.KEYWORD1);
208             eiffelKeywords.add("implies",Token.KEYWORD1);
209             eiffelKeywords.add("indexing", Token.KEYWORD1);
210             eiffelKeywords.add("infix", Token.KEYWORD1);
211             eiffelKeywords.add("inherit", Token.KEYWORD1);
212             eiffelKeywords.add("inspect", Token.KEYWORD1);
213             eiffelKeywords.add("invariant", Token.KEYWORD1);
214             eiffelKeywords.add("is", Token.KEYWORD1);
215             eiffelKeywords.add("like", Token.KEYWORD1);
216             eiffelKeywords.add("local", Token.KEYWORD1);
217             eiffelKeywords.add("loop", Token.KEYWORD1);
218             eiffelKeywords.add("not", Token.KEYWORD1);
219             eiffelKeywords.add("obsolete", Token.KEYWORD1);
220             eiffelKeywords.add("old",Token.KEYWORD1);
221             eiffelKeywords.add("once", Token.KEYWORD1);
222             eiffelKeywords.add("or", Token.KEYWORD1);
223             eiffelKeywords.add("prefix", Token.KEYWORD1);
224             eiffelKeywords.add("redefine", Token.KEYWORD1);
225             eiffelKeywords.add("rename", Token.KEYWORD1);
226             eiffelKeywords.add("require", Token.KEYWORD1);
227             eiffelKeywords.add("rescue", Token.KEYWORD1);
228             eiffelKeywords.add("retry", Token.KEYWORD1);
229             eiffelKeywords.add("select", Token.KEYWORD1);
230             eiffelKeywords.add("separate", Token.KEYWORD1);
231             eiffelKeywords.add("then",Token.KEYWORD1);
232             eiffelKeywords.add("undefine", Token.KEYWORD1);
233             eiffelKeywords.add("until", Token.KEYWORD1);
234             eiffelKeywords.add("variant", Token.KEYWORD1);
235             eiffelKeywords.add("when", Token.KEYWORD1);
236             eiffelKeywords.add("xor", Token.KEYWORD1);
237
238             eiffelKeywords.add("current",Token.LITERAL2);
239             eiffelKeywords.add("false",Token.LITERAL2);
240             eiffelKeywords.add("precursor",Token.LITERAL2);
241             eiffelKeywords.add("result",Token.LITERAL2);
242             eiffelKeywords.add("strip",Token.LITERAL2);
243             eiffelKeywords.add("true",Token.LITERAL2);
244             eiffelKeywords.add("unique",Token.LITERAL2);
245             eiffelKeywords.add("void",Token.LITERAL2);
246
247         }
248         return eiffelKeywords;
249     }
250
251     // private members
252
private static KeywordMap eiffelKeywords;
253
254     private boolean cpp;
255     private KeywordMap keywords;
256     private int lastOffset;
257     private int lastKeyword;
258
259     private boolean doKeyword(Segment JavaDoc line, int i, char c)
260     {
261         int i1 = i+1;
262         boolean klassname = false;
263
264         int len = i - lastKeyword;
265         byte id = keywords.lookup(line,lastKeyword,len);
266         if ( id == Token.NULL )
267         {
268             klassname = true;
269             for ( int at = lastKeyword; at < lastKeyword + len; at++ )
270             {
271                 char ch = line.array[at];
272                 if ( ch != '_' && !Character.isUpperCase(ch) )
273                 {
274                     klassname = false;
275                     break;
276                 }
277             }
278             if ( klassname )
279                 id = Token.KEYWORD3;
280         }
281
282         if(id != Token.NULL)
283         {
284             if(lastKeyword != lastOffset)
285                 addToken(lastKeyword - lastOffset,Token.NULL);
286             addToken(len,id);
287             lastOffset = i;
288         }
289         lastKeyword = i1;
290         return false;
291     }
292 }
293
Popular Tags