KickJava   Java API By Example, From Geeks To Geeks.

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


1 package org.jedit.syntax;
2
3 /*
4  * PythonTokenMarker.java - Python token marker
5  * Copyright (C) 1999 Jonathan Revusky
6  * Copyright (C) 1998, 1999 Slava Pestov
7  *
8  * You may use and modify this package for any purpose. Redistribution is
9  * permitted, in both source and binary form, provided that this notice
10  * remains intact in all source distributions of this package.
11  */

12
13 import javax.swing.text.Segment JavaDoc;
14
15 /**
16  * Python token marker.
17  *
18  * @author Jonathan Revusky
19  * @version $Id: PythonTokenMarker.java,v 1.1 2003/12/14 16:29:49 daggerrz Exp $
20  */

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 JavaDoc 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 JavaDoc("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 members
218
private static KeywordMap pyKeywords;
219
220    private KeywordMap keywords;
221    private int lastOffset;
222    private int lastKeyword;
223
224    private boolean doKeyword(Segment JavaDoc 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