1 package org.jedit.syntax; 2 3 12 13 import javax.swing.text.Segment ; 14 15 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 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 ("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 ("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 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 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 |