KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > syntax > jedit > tokenmarker > PythonTokenMarker


1 /*
2  * Copyright (C) 2005 - 2006 JasperSoft Corporation. All rights reserved.
3  * http://www.jaspersoft.com.
4  *
5  * Unless you have purchased a commercial license agreement from JasperSoft,
6  * the following license terms apply:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  *
12  * This program is distributed WITHOUT ANY WARRANTY; and without the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
18  * or write to:
19  *
20  * Free Software Foundation, Inc.,
21  * 59 Temple Place - Suite 330,
22  * Boston, MA USA 02111-1307
23  *
24  *
25  *
26  *
27  * PythonTokenMarker.java
28  *
29  */

30
31 package org.syntax.jedit.tokenmarker;
32
33 import org.syntax.jedit.*;
34 import javax.swing.text.Segment JavaDoc;
35
36 /**
37  * Python token marker.
38  *
39  * @author Jonathan Revusky
40  * @version $Id: PythonTokenMarker.java 932 2006-10-20 09:32:45Z gtoffoli $
41  */

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 JavaDoc 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 JavaDoc("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 members
239
private static KeywordMap pyKeywords;
240
241     private KeywordMap keywords;
242     private int lastOffset;
243     private int lastKeyword;
244
245     private boolean doKeyword(Segment JavaDoc 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