1 30 31 package org.syntax.jedit.tokenmarker; 32 33 import org.syntax.jedit.*; 34 import javax.swing.text.Segment ; 35 36 42 public class PythonTokenMarker extends TokenMarker 43 { 44 private static final byte TRIPLEQUOTE1 = Token.INTERNAL_FIRST; 45 private static final byte TRIPLEQUOTE2 = Token.INTERNAL_LAST; 46 47 public PythonTokenMarker() 48 { 49 this.keywords = getKeywords(); 50 } 51 52 public byte markTokensImpl(byte token, Segment line, int lineIndex) 53 { 54 char[] array = line.array; 55 int offset = line.offset; 56 lastOffset = offset; 57 lastKeyword = offset; 58 int length = line.count + offset; 59 boolean backslash = false; 60 61 loop: for(int i = offset; i < length; i++) 62 { 63 int i1 = (i+1); 64 65 char c = array[i]; 66 if(c == '\\') 67 { 68 backslash = !backslash; 69 continue; 70 } 71 72 switch(token) 73 { 74 case Token.NULL: 75 switch(c) 76 { 77 case '#': 78 if(backslash) 79 backslash = false; 80 else 81 { 82 doKeyword(line,i,c); 83 addToken(i - lastOffset,token); 84 addToken(length - i,Token.COMMENT1); 85 lastOffset = lastKeyword = length; 86 break loop; 87 } 88 break; 89 case '"': 90 doKeyword(line,i,c); 91 if(backslash) 92 backslash = false; 93 else 94 { 95 addToken(i - lastOffset,token); 96 if(SyntaxUtilities.regionMatches(false, 97 line,i1,"\"\"")) 98 { 99 token = TRIPLEQUOTE1; 100 } 101 else 102 { 103 token = Token.LITERAL1; 104 } 105 lastOffset = lastKeyword = i; 106 } 107 break; 108 case '\'': 109 doKeyword(line,i,c); 110 if(backslash) 111 backslash = false; 112 else 113 { 114 addToken(i - lastOffset,token); 115 if(SyntaxUtilities.regionMatches(false, 116 line,i1,"''")) 117 { 118 token = TRIPLEQUOTE2; 119 } 120 else 121 { 122 token = Token.LITERAL2; 123 } 124 lastOffset = lastKeyword = i; 125 } 126 break; 127 default: 128 backslash = false; 129 if(!Character.isLetterOrDigit(c) 130 && c != '_') 131 doKeyword(line,i,c); 132 break; 133 } 134 break; 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 case TRIPLEQUOTE1: 156 if(backslash) 157 backslash = false; 158 else if(SyntaxUtilities.regionMatches(false, 159 line,i,"\"\"\"")) 160 { 161 addToken((i+=4) - lastOffset, 162 Token.LITERAL1); 163 token = Token.NULL; 164 lastOffset = lastKeyword = i; 165 } 166 break; 167 case TRIPLEQUOTE2: 168 if(backslash) 169 backslash = false; 170 else if(SyntaxUtilities.regionMatches(false, 171 line,i,"'''")) 172 { 173 addToken((i+=4) - lastOffset, 174 Token.LITERAL1); 175 token = Token.NULL; 176 lastOffset = lastKeyword = i; 177 } 178 break; 179 default: 180 throw new InternalError ("Invalid state: " 181 + token); 182 } 183 } 184 185 switch(token) 186 { 187 case TRIPLEQUOTE1: 188 case TRIPLEQUOTE2: 189 addToken(length - lastOffset,Token.LITERAL1); 190 break; 191 case Token.NULL: 192 doKeyword(line,length,'\0'); 193 default: 194 addToken(length - lastOffset,token); 195 break; 196 } 197 198 return token; 199 } 200 201 public static KeywordMap getKeywords() 202 { 203 if (pyKeywords == null) 204 { 205 pyKeywords = new KeywordMap(false); 206 pyKeywords.add("and",Token.KEYWORD3); 207 pyKeywords.add("not",Token.KEYWORD3); 208 pyKeywords.add("or",Token.KEYWORD3); 209 pyKeywords.add("if",Token.KEYWORD1); 210 pyKeywords.add("for",Token.KEYWORD1); 211 pyKeywords.add("assert",Token.KEYWORD1); 212 pyKeywords.add("break",Token.KEYWORD1); 213 pyKeywords.add("continue",Token.KEYWORD1); 214 pyKeywords.add("elif",Token.KEYWORD1); 215 pyKeywords.add("else",Token.KEYWORD1); 216 pyKeywords.add("except",Token.KEYWORD1); 217 pyKeywords.add("exec",Token.KEYWORD1); 218 pyKeywords.add("finally",Token.KEYWORD1); 219 pyKeywords.add("raise",Token.KEYWORD1); 220 pyKeywords.add("return",Token.KEYWORD1); 221 pyKeywords.add("try",Token.KEYWORD1); 222 pyKeywords.add("while",Token.KEYWORD1); 223 pyKeywords.add("def",Token.KEYWORD2); 224 pyKeywords.add("class",Token.KEYWORD2); 225 pyKeywords.add("del",Token.KEYWORD2); 226 pyKeywords.add("from",Token.KEYWORD2); 227 pyKeywords.add("global",Token.KEYWORD2); 228 pyKeywords.add("import",Token.KEYWORD2); 229 pyKeywords.add("in",Token.KEYWORD2); 230 pyKeywords.add("is",Token.KEYWORD2); 231 pyKeywords.add("lambda",Token.KEYWORD2); 232 pyKeywords.add("pass",Token.KEYWORD2); 233 pyKeywords.add("print",Token.KEYWORD2); 234 } 235 return pyKeywords; 236 } 237 238 private static KeywordMap pyKeywords; 240 241 private KeywordMap keywords; 242 private int lastOffset; 243 private int lastKeyword; 244 245 private boolean doKeyword(Segment line, int i, char c) 246 { 247 int i1 = i+1; 248 249 int len = i - lastKeyword; 250 byte id = keywords.lookup(line,lastKeyword,len); 251 if(id != Token.NULL) 252 { 253 if(lastKeyword != lastOffset) 254 addToken(lastKeyword - lastOffset,Token.NULL); 255 addToken(len,id); 256 lastOffset = i; 257 } 258 lastKeyword = i1; 259 return false; 260 } 261 } 262 | Popular Tags |