1 30 31 package it.businesslogic.ireport.gui.syntax; 32 33 import org.syntax.jedit.*; 34 import org.syntax.jedit.tokenmarker.*; 35 import javax.swing.text.Segment ; 36 37 43 public class JRTokenMarker extends TokenMarker 44 { 45 public byte FIELD_KEYWORD = 0; 46 public byte VARIABLE_KEYWORD = 0; 47 public byte PARAMETER_KEYWORD = 0; 48 49 public JRTokenMarker() 50 { 51 this(getKeywords()); 52 } 53 54 public JRTokenMarker(KeywordMap keywords) 55 { 56 this.keywords = keywords; 57 FIELD_KEYWORD = Token.KEYWORD1; 58 VARIABLE_KEYWORD = Token.KEYWORD2; 59 PARAMETER_KEYWORD = Token.KEYWORD3; 60 61 } 62 63 public byte markTokensImpl(byte token, Segment line, int lineIndex) 64 { 65 char[] array = line.array; 66 int offset = line.offset; 67 lastOffset = offset; 68 lastKeyword = offset; 69 int length = line.count + offset; 70 boolean backslash = false; 71 72 loop: for(int i = offset; i < length; i++) 73 { 74 int i1 = (i+1); 75 76 char c = array[i]; 77 if(c == '\\') 78 { 79 backslash = !backslash; 80 continue; 81 } 82 83 switch(token) 84 { 85 case Token.NULL: 86 switch(c) 87 { 88 case '#': 89 if(backslash) 90 backslash = false; 91 else if(cpp) 92 { 93 if(doKeyword(line,i,c)) 94 break; 95 addToken(i - lastOffset,token); 96 addToken(length - i,Token.KEYWORD2); 97 lastOffset = lastKeyword = length; 98 break loop; 99 } 100 break; 101 case '"': 102 doKeyword(line,i,c); 103 if(backslash) 104 backslash = false; 105 else 106 { 107 addToken(i - lastOffset,token); 108 token = Token.LITERAL1; 109 lastOffset = lastKeyword = i; 110 } 111 break; 112 case '\'': 113 doKeyword(line,i,c); 114 if(backslash) 115 backslash = false; 116 else 117 { 118 addToken(i - lastOffset,token); 119 token = Token.LITERAL2; 120 lastOffset = lastKeyword = i; 121 } 122 break; 123 case ':': 124 if(lastKeyword == offset) 125 { 126 if(doKeyword(line,i,c)) 127 break; 128 backslash = false; 129 addToken(i1 - lastOffset,Token.LABEL); 130 lastOffset = lastKeyword = i1; 131 } 132 else if(doKeyword(line,i,c)) 133 break; 134 break; 135 case '/': 136 backslash = false; 137 doKeyword(line,i,c); 138 if(length - i > 1) 139 { 140 switch(array[i1]) 141 { 142 case '*': 143 addToken(i - lastOffset,token); 144 lastOffset = lastKeyword = i; 145 if(length - i > 2 && array[i+2] == '*') 146 token = Token.COMMENT2; 147 else 148 token = Token.COMMENT1; 149 break; 150 case '/': 151 addToken(i - lastOffset,token); 152 addToken(length - i,Token.COMMENT1); 153 lastOffset = lastKeyword = length; 154 break loop; 155 } 156 } 157 break; 158 default: 159 backslash = false; 160 if(!Character.isLetterOrDigit(c) 161 && c != '_') 162 doKeyword(line,i,c); 163 break; 164 } 165 break; 166 case Token.COMMENT1: 167 case Token.COMMENT2: 168 backslash = false; 169 if(c == '*' && length - i > 1) 170 { 171 if(array[i1] == '/') 172 { 173 i++; 174 addToken((i+1) - lastOffset,token); 175 token = Token.NULL; 176 lastOffset = lastKeyword = i+1; 177 } 178 } 179 break; 180 case Token.LITERAL1: 181 if(backslash) 182 backslash = false; 183 else if(c == '"') 184 { 185 addToken(i1 - lastOffset,token); 186 token = Token.NULL; 187 lastOffset = lastKeyword = i1; 188 } 189 break; 190 case Token.LITERAL2: 191 if(backslash) 192 backslash = false; 193 else if(c == '\'') 194 { 195 addToken(i1 - lastOffset,Token.LITERAL1); 196 token = Token.NULL; 197 lastOffset = lastKeyword = i1; 198 } 199 break; 200 default: 201 throw new InternalError ("Invalid state: " 202 + token); 203 } 204 } 205 206 if(token == Token.NULL) 207 doKeyword(line,length,'\0'); 208 209 switch(token) 210 { 211 case Token.LITERAL1: 212 case Token.LITERAL2: 213 addToken(length - lastOffset,Token.INVALID); 214 token = Token.NULL; 215 break; 216 case Token.KEYWORD2: 217 addToken(length - lastOffset,token); 218 if(!backslash) 219 token = Token.NULL; 220 default: 221 addToken(length - lastOffset,token); 222 break; 223 } 224 225 return token; 226 } 227 228 public static KeywordMap getKeywords() 229 { 230 if(cKeywords == null) 231 { 232 cKeywords = new KeywordMap(false); 233 cKeywords.add("package",Token.KEYWORD2); 234 cKeywords.add("import",Token.KEYWORD2); 235 cKeywords.add("byte",Token.KEYWORD3); 236 cKeywords.add("char",Token.KEYWORD3); 237 cKeywords.add("short",Token.KEYWORD3); 238 cKeywords.add("int",Token.KEYWORD3); 239 cKeywords.add("long",Token.KEYWORD3); 240 cKeywords.add("float",Token.KEYWORD3); 241 cKeywords.add("double",Token.KEYWORD3); 242 cKeywords.add("boolean",Token.KEYWORD3); 243 cKeywords.add("void",Token.KEYWORD3); 244 cKeywords.add("class",Token.KEYWORD3); 245 cKeywords.add("interface",Token.KEYWORD3); 246 cKeywords.add("abstract",Token.KEYWORD1); 247 cKeywords.add("final",Token.KEYWORD1); 248 cKeywords.add("private",Token.KEYWORD1); 249 cKeywords.add("protected",Token.KEYWORD1); 250 cKeywords.add("public",Token.KEYWORD1); 251 cKeywords.add("static",Token.KEYWORD1); 252 cKeywords.add("synchronized",Token.KEYWORD1); 253 cKeywords.add("native",Token.KEYWORD1); 254 cKeywords.add("volatile",Token.KEYWORD1); 255 cKeywords.add("transient",Token.KEYWORD1); 256 cKeywords.add("break",Token.KEYWORD1); 257 cKeywords.add("case",Token.KEYWORD1); 258 cKeywords.add("continue",Token.KEYWORD1); 259 cKeywords.add("default",Token.KEYWORD1); 260 cKeywords.add("do",Token.KEYWORD1); 261 cKeywords.add("else",Token.KEYWORD1); 262 cKeywords.add("for",Token.KEYWORD1); 263 cKeywords.add("if",Token.KEYWORD1); 264 cKeywords.add("instanceof",Token.KEYWORD1); 265 cKeywords.add("new",Token.KEYWORD1); 266 cKeywords.add("return",Token.KEYWORD1); 267 cKeywords.add("switch",Token.KEYWORD1); 268 cKeywords.add("while",Token.KEYWORD1); 269 cKeywords.add("throw",Token.KEYWORD1); 270 cKeywords.add("try",Token.KEYWORD1); 271 cKeywords.add("catch",Token.KEYWORD1); 272 cKeywords.add("extends",Token.KEYWORD1); 273 cKeywords.add("finally",Token.KEYWORD1); 274 cKeywords.add("implements",Token.KEYWORD1); 275 cKeywords.add("throws",Token.KEYWORD1); 276 cKeywords.add("this",Token.LITERAL2); 277 cKeywords.add("null",Token.LITERAL2); 278 cKeywords.add("super",Token.LITERAL2); 279 cKeywords.add("true",Token.LITERAL2); 280 cKeywords.add("false",Token.LITERAL2); 281 cKeywords.add("$PPPQ",Token.LITERAL2); 282 cKeywords.add("giulio",Token.LITERAL2); 283 } 284 return cKeywords; 285 } 286 287 private static KeywordMap cKeywords; 289 290 private boolean cpp; 291 protected KeywordMap keywords; 292 private int lastOffset; 293 private int lastKeyword; 294 295 private boolean doKeyword(Segment line, int i, char c) 296 { 297 int i1 = i+1; 298 299 int len = i - lastKeyword; 300 byte id = keywords.lookup(line,lastKeyword,len); 301 if(id != Token.NULL) 302 { 303 if(lastKeyword != lastOffset) 304 addToken(lastKeyword - lastOffset,Token.NULL); 305 addToken(len,id); 306 lastOffset = i; 307 } 308 lastKeyword = i1; 309 return false; 310 } 311 312 public void addKeyword(String key, byte id) 313 { 314 keywords.add( key, id); 315 316 } 317 318 } 319 | Popular Tags |