Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.utils / src / main / java / org / gvsig / utils / console / jedit / EiffelTokenMarker.java @ 40561

History | View | Annotate | Download (7.84 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * 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, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.utils.console.jedit;
25
/*
26
 * EiffelTokenMarker.java - Eiffel token marker
27
 * Copyright (C) 1999 Slava Pestov
28
 * Copyright (C) 1999 Artur Biesiadowski
29
 *
30
 * You may use and modify this package for any purpose. Redistribution is
31
 * permitted, in both source and binary form, provided that this notice
32
 * remains intact in all source distributions of this package.
33
 */
34

    
35
import javax.swing.text.Segment;
36

    
37
/**
38
 * Eiffel token Marker.
39
 *
40
 * @author Artur Biesiadowski
41
 */
42
public class EiffelTokenMarker extends TokenMarker
43
{
44

    
45
        public EiffelTokenMarker()
46
        {
47
                this.keywords = getKeywords();
48
        }
49

    
50
        public byte markTokensImpl(byte token, Segment line, int lineIndex)
51
        {
52
                char[] array = line.array;
53
                int offset = line.offset;
54
                lastOffset = offset;
55
                lastKeyword = offset;
56
                int length = line.count + offset;
57
                boolean backslash = false;
58

    
59
loop:                for(int i = offset; i < length; i++)
60
                {
61
                        int i1 = (i+1);
62

    
63
                        char c = array[i];
64
                        if(c == '%')
65
                        {
66
                                backslash = !backslash;
67
                                continue;
68
                        }
69

    
70
                        switch(token)
71
                        {
72
                        case Token.NULL:
73
                                switch(c)
74
                                {
75
                                case '"':
76
                                        doKeyword(line,i,c);
77
                                        if(backslash)
78
                                                backslash = false;
79
                                        else
80
                                        {
81
                                                addToken(i - lastOffset,token);
82
                                                token = Token.LITERAL1;
83
                                                lastOffset = lastKeyword = i;
84
                                        }
85
                                        break;
86
                                case '\'':
87
                                        doKeyword(line,i,c);
88
                                        if(backslash)
89
                                                backslash = false;
90
                                        else
91
                                        {
92
                                                addToken(i - lastOffset,token);
93
                                                token = Token.LITERAL2;
94
                                                lastOffset = lastKeyword = i;
95
                                        }
96
                                        break;
97
                                case ':':
98
                                        if(lastKeyword == offset)
99
                                        {
100
                                                if(doKeyword(line,i,c))
101
                                                        break;
102
                                                backslash = false;
103
                                                addToken(i1 - lastOffset,Token.LABEL);
104
                                                lastOffset = lastKeyword = i1;
105
                                        }
106
                                        else if(doKeyword(line,i,c))
107
                                                break;
108
                                        break;
109
                                case '-':
110
                                        backslash = false;
111
                                        doKeyword(line,i,c);
112
                                        if(length - i > 1)
113
                                        {
114
                                                switch(array[i1])
115
                                                {
116
                                                case '-':
117
                                                        addToken(i - lastOffset,token);
118
                                                        addToken(length - i,Token.COMMENT1);
119
                                                        lastOffset = lastKeyword = length;
120
                                                        break loop;
121
                                                }
122
                                        }
123
                                        break;
124
                                default:
125
                                        backslash = false;
126
                                        if(!Character.isLetterOrDigit(c)
127
                                                && c != '_')
128
                                                doKeyword(line,i,c);
129
                                        break;
130
                                }
131
                                break;
132
                        case Token.COMMENT1:
133
                        case Token.COMMENT2:
134
                                throw new RuntimeException("Wrong eiffel parser state");
135
                        case Token.LITERAL1:
136
                                if(backslash)
137
                                        backslash = false;
138
                                else if(c == '"')
139
                                {
140
                                        addToken(i1 - lastOffset,token);
141
                                        token = Token.NULL;
142
                                        lastOffset = lastKeyword = i1;
143
                                }
144
                                break;
145
                        case Token.LITERAL2:
146
                                if(backslash)
147
                                        backslash = false;
148
                                else if(c == '\'')
149
                                {
150
                                        addToken(i1 - lastOffset,Token.LITERAL1);
151
                                        token = Token.NULL;
152
                                        lastOffset = lastKeyword = i1;
153
                                }
154
                                break;
155
                        default:
156
                                throw new InternalError("Invalid state: "
157
                                        + token);
158
                        }
159
                }
160

    
161
                if(token == Token.NULL)
162
                        doKeyword(line,length,'\0');
163

    
164
                switch(token)
165
                {
166
                case Token.LITERAL1:
167
                case Token.LITERAL2:
168
                        addToken(length - lastOffset,Token.INVALID);
169
                        token = Token.NULL;
170
                        break;
171
                case Token.KEYWORD2:
172
                        addToken(length - lastOffset,token);
173
                        if(!backslash)
174
                                token = Token.NULL;
175
                default:
176
                        addToken(length - lastOffset,token);
177
                        break;
178
                }
179

    
180
                return token;
181
        }
182

    
183
        public static KeywordMap getKeywords()
184
        {
185
                if(eiffelKeywords == null)
186
                {
187
                        eiffelKeywords = new KeywordMap(true);
188
                        eiffelKeywords.add("alias", Token.KEYWORD1);
189
                        eiffelKeywords.add("all", Token.KEYWORD1);
190
                        eiffelKeywords.add("and", Token.KEYWORD1);
191
                        eiffelKeywords.add("as", Token.KEYWORD1);
192
                        eiffelKeywords.add("check", Token.KEYWORD1);
193
                        eiffelKeywords.add("class", Token.KEYWORD1);
194
                        eiffelKeywords.add("creation", Token.KEYWORD1);
195
                        eiffelKeywords.add("debug", Token.KEYWORD1);
196
                        eiffelKeywords.add("deferred", Token.KEYWORD1);
197
                        eiffelKeywords.add("do", Token.KEYWORD1);
198
                        eiffelKeywords.add("else",Token.KEYWORD1);
199
                        eiffelKeywords.add("elseif", Token.KEYWORD1);
200
                        eiffelKeywords.add("end", Token.KEYWORD1);
201
                        eiffelKeywords.add("ensure", Token.KEYWORD1);
202
                        eiffelKeywords.add("expanded", Token.KEYWORD1);
203
                        eiffelKeywords.add("export", Token.KEYWORD1);
204
                        eiffelKeywords.add("external", Token.KEYWORD1);
205
                        eiffelKeywords.add("feature", Token.KEYWORD1);
206
                        eiffelKeywords.add("from", Token.KEYWORD1);
207
                        eiffelKeywords.add("frozen", Token.KEYWORD1);
208
                        eiffelKeywords.add("if", Token.KEYWORD1);
209
                        eiffelKeywords.add("implies",Token.KEYWORD1);
210
                        eiffelKeywords.add("indexing", Token.KEYWORD1);
211
                        eiffelKeywords.add("infix", Token.KEYWORD1);
212
                        eiffelKeywords.add("inherit", Token.KEYWORD1);
213
                        eiffelKeywords.add("inspect", Token.KEYWORD1);
214
                        eiffelKeywords.add("invariant", Token.KEYWORD1);
215
                        eiffelKeywords.add("is", Token.KEYWORD1);
216
                        eiffelKeywords.add("like", Token.KEYWORD1);
217
                        eiffelKeywords.add("local", Token.KEYWORD1);
218
                        eiffelKeywords.add("loop", Token.KEYWORD1);
219
                        eiffelKeywords.add("not", Token.KEYWORD1);
220
                        eiffelKeywords.add("obsolete", Token.KEYWORD1);
221
                        eiffelKeywords.add("old",Token.KEYWORD1);
222
                        eiffelKeywords.add("once", Token.KEYWORD1);
223
                        eiffelKeywords.add("or", Token.KEYWORD1);
224
                        eiffelKeywords.add("prefix", Token.KEYWORD1);
225
                        eiffelKeywords.add("redefine", Token.KEYWORD1);
226
                        eiffelKeywords.add("rename", Token.KEYWORD1);
227
                        eiffelKeywords.add("require", Token.KEYWORD1);
228
                        eiffelKeywords.add("rescue", Token.KEYWORD1);
229
                        eiffelKeywords.add("retry", Token.KEYWORD1);
230
                        eiffelKeywords.add("select", Token.KEYWORD1);
231
                        eiffelKeywords.add("separate", Token.KEYWORD1);
232
                        eiffelKeywords.add("then",Token.KEYWORD1);
233
                        eiffelKeywords.add("undefine", Token.KEYWORD1);
234
                        eiffelKeywords.add("until", Token.KEYWORD1);
235
                        eiffelKeywords.add("variant", Token.KEYWORD1);
236
                        eiffelKeywords.add("when", Token.KEYWORD1);
237
                        eiffelKeywords.add("xor", Token.KEYWORD1);
238

    
239
                        eiffelKeywords.add("current",Token.LITERAL2);
240
                        eiffelKeywords.add("false",Token.LITERAL2);
241
                        eiffelKeywords.add("precursor",Token.LITERAL2);
242
                        eiffelKeywords.add("result",Token.LITERAL2);
243
                        eiffelKeywords.add("strip",Token.LITERAL2);
244
                        eiffelKeywords.add("true",Token.LITERAL2);
245
                        eiffelKeywords.add("unique",Token.LITERAL2);
246
                        eiffelKeywords.add("void",Token.LITERAL2);
247

    
248
                }
249
                return eiffelKeywords;
250
        }
251

    
252
        // private members
253
        private static KeywordMap eiffelKeywords;
254

    
255
        private boolean cpp;
256
        private KeywordMap keywords;
257
        private int lastOffset;
258
        private int lastKeyword;
259

    
260
        private boolean doKeyword(Segment line, int i, char c)
261
        {
262
                int i1 = i+1;
263
                boolean klassname = false;
264

    
265
                int len = i - lastKeyword;
266
                byte id = keywords.lookup(line,lastKeyword,len);
267
                if ( id == Token.NULL )
268
                {
269
                        klassname = true;
270
                        for ( int at = lastKeyword; at < lastKeyword + len; at++ )
271
                        {
272
                                char ch = line.array[at];
273
                                if ( ch != '_' && !Character.isUpperCase(ch) )
274
                                {
275
                                        klassname = false;
276
                                        break;
277
                                }
278
                        }
279
                        if ( klassname )
280
                                id = Token.KEYWORD3;
281
                }
282

    
283
                if(id != Token.NULL)
284
                {
285
                        if(lastKeyword != lastOffset)
286
                                addToken(lastKeyword - lastOffset,Token.NULL);
287
                        addToken(len,id);
288
                        lastOffset = i;
289
                }
290
                lastKeyword = i1;
291
                return false;
292
        }
293
}