KickJava   Java API By Example, From Geeks To Geeks.

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


1 package org.jedit.syntax;
2
3 /*
4  * EiffelTokenMarker.java - Eiffel token marker
5  * Copyright (C) 1999 Slava Pestov
6  * Copyright (C) 1999 Artur Biesiadowski
7  *
8  * You may use and modify this package for any purpose. Redistribution is
9  * permitted, in both source and binary form, provided that this notice
10  * remains intact in all source distributions of this package.
11  */

12
13 import javax.swing.text.Segment JavaDoc;
14
15 /**
16  * Eiffel token Marker.
17  *
18  * @author Artur Biesiadowski
19  */

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