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