1 30 31 package org.syntax.jedit.tokenmarker; 32 33 import org.syntax.jedit.*; 34 import javax.swing.text.Segment ; 35 36 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 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 ("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 ("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 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 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 |