Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.utils / src / main / java / org / gvsig / utils / console / jedit / PerlTokenMarker.java @ 40561

History | View | Annotate | Download (21.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * 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, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.utils.console.jedit;
25
/*
26
 * PerlTokenMarker.java - Perl token marker
27
 * Copyright (C) 1998, 1999 Slava Pestov
28
 *
29
 * You may use and modify this package for any purpose. Redistribution is
30
 * permitted, in both source and binary form, provided that this notice
31
 * remains intact in all source distributions of this package.
32
 */
33

    
34
import javax.swing.text.Segment;
35

    
36
/**
37
 * Perl token marker.
38
 *
39
 * @author Slava Pestov
40
 * @version $Id$
41
 */
42
public class PerlTokenMarker extends TokenMarker
43
{
44
        // public members
45
        public static final byte S_ONE = Token.INTERNAL_FIRST;
46
        public static final byte S_TWO = (byte)(Token.INTERNAL_FIRST + 1);
47
        public static final byte S_END = (byte)(Token.INTERNAL_FIRST + 2);
48

    
49
        public PerlTokenMarker()
50
        {
51
                this(getKeywords());
52
        }
53

    
54
        public PerlTokenMarker(KeywordMap keywords)
55
        {
56
                this.keywords = keywords;
57
        }
58

    
59
        public byte markTokensImpl(byte _token, Segment line, int lineIndex)
60
        {
61
                char[] array = line.array;
62
                int offset = line.offset;
63
                token = _token;
64
                lastOffset = offset;
65
                lastKeyword = offset;
66
                matchChar = '\0';
67
                matchCharBracket = false;
68
                matchSpacesAllowed = false;
69
                int length = line.count + offset;
70

    
71
                if(token == Token.LITERAL1 && lineIndex != 0
72
                        && lineInfo[lineIndex - 1].obj != null)
73
                {
74
                        String str = (String)lineInfo[lineIndex - 1].obj;
75
                        if(str != null && str.length() == line.count
76
                                && SyntaxUtilities.regionMatches(false,line,
77
                                offset,str))
78
                        {
79
                                addToken(line.count,token);
80
                                return Token.NULL;
81
                        }
82
                        else
83
                        {
84
                                addToken(line.count,token);
85
                                lineInfo[lineIndex].obj = str;
86
                                return token;
87
                        }
88
                }
89

    
90
                boolean backslash = false;
91
loop:                for(int i = offset; i < length; i++)
92
                {
93
                        int i1 = (i+1);
94

    
95
                        char c = array[i];
96
                        if(c == '\\')
97
                        {
98
                                backslash = !backslash;
99
                                continue;
100
                        }
101

    
102
                        switch(token)
103
                        {
104
                        case Token.NULL:
105
                                switch(c)
106
                                {
107
                                case '#':
108
                                        if(doKeyword(line,i,c))
109
                                                break;
110
                                        if(backslash)
111
                                                backslash = false;
112
                                        else
113
                                        {
114
                                                addToken(i - lastOffset,token);
115
                                                addToken(length - i,Token.COMMENT1);
116
                                                lastOffset = lastKeyword = length;
117
                                                break loop;
118
                                        }
119
                                        break;
120
                                case '=':
121
                                        backslash = false;
122
                                        if(i == offset)
123
                                        {
124
                                                token = Token.COMMENT2;
125
                                                addToken(length - i,token);
126
                                                lastOffset = lastKeyword = length;
127
                                                break loop;
128
                                        }
129
                                        else
130
                                                doKeyword(line,i,c);
131
                                        break;
132
                                case '$': case '&': case '%': case '@':
133
                                        backslash = false;
134
                                        if(doKeyword(line,i,c))
135
                                                break;
136
                                        if(length - i > 1)
137
                                        {
138
                                                if(c == '&' && (array[i1] == '&'
139
                                                        || Character.isWhitespace(
140
                                                        array[i1])))
141
                                                        i++;
142
                                                else
143
                                                {
144
                                                        addToken(i - lastOffset,token);
145
                                                        lastOffset = lastKeyword = i;
146
                                                        token = Token.KEYWORD2;
147
                                                }
148
                                        }
149
                                        break;
150
                                case '"':
151
                                        if(doKeyword(line,i,c))
152
                                                break;
153
                                        if(backslash)
154
                                                backslash = false;
155
                                        else
156
                                        {
157
                                                addToken(i - lastOffset,token);
158
                                                token = Token.LITERAL1;
159
                                                lineInfo[lineIndex].obj = null;
160
                                                lastOffset = lastKeyword = i;
161
                                        }
162
                                        break;
163
                                case '\'':
164
                                        if(backslash)
165
                                                backslash = false;
166
                                        else
167
                                        {
168
                                                int oldLastKeyword = lastKeyword;
169
                                                if(doKeyword(line,i,c))
170
                                                        break;
171
                                                if(i != oldLastKeyword)
172
                                                        break;
173
                                                addToken(i - lastOffset,token);
174
                                                token = Token.LITERAL2;
175
                                                lastOffset = lastKeyword = i;
176
                                        }
177
                                        break;
178
                                case '`':
179
                                        if(doKeyword(line,i,c))
180
                                                break;
181
                                        if(backslash)
182
                                                backslash = false;
183
                                        else
184
                                        {
185
                                                addToken(i - lastOffset,token);
186
                                                token = Token.OPERATOR;
187
                                                lastOffset = lastKeyword = i;
188
                                        }
189
                                        break;
190
                                case '<':
191
                                        if(doKeyword(line,i,c))
192
                                                break;
193
                                        if(backslash)
194
                                                backslash = false;
195
                                        else
196
                                        {
197
                                                if(length - i > 2 && array[i1] == '<'
198
                                                        && !Character.isWhitespace(array[i+2]))
199
                                                {
200
                                                        addToken(i - lastOffset,token);
201
                                                        lastOffset = lastKeyword = i;
202
                                                        token = Token.LITERAL1;
203
                                                        int len = length - (i+2);
204
                                                        if(array[length - 1] == ';')
205
                                                                len--;
206
                                                        lineInfo[lineIndex].obj =
207
                                                                createReadinString(array,i + 2,len);
208
                                                }
209
                                        }
210
                                        break;
211
                                case ':':
212
                                        backslash = false;
213
                                        if(doKeyword(line,i,c))
214
                                                break;
215
                                        // Doesn't pick up all labels,
216
                                        // but at least doesn't mess up
217
                                        // XXX::YYY
218
                                        if(lastKeyword != 0)
219
                                                break;
220
                                        addToken(i1 - lastOffset,Token.LABEL);
221
                                        lastOffset = lastKeyword = i1;
222
                                        break;
223
                                case '-':
224
                                        backslash = false;
225
                                        if(doKeyword(line,i,c))
226
                                                break;
227
                                        if(i != lastKeyword || length - i <= 1)
228
                                                break;
229
                                        switch(array[i1])
230
                                        {
231
                                        case 'r': case 'w': case 'x':
232
                                        case 'o': case 'R': case 'W':
233
                                        case 'X': case 'O': case 'e':
234
                                        case 'z': case 's': case 'f':
235
                                        case 'd': case 'l': case 'p':
236
                                        case 'S': case 'b': case 'c':
237
                                        case 't': case 'u': case 'g':
238
                                        case 'k': case 'T': case 'B':
239
                                        case 'M': case 'A': case 'C':
240
                                                addToken(i - lastOffset,token);
241
                                                addToken(2,Token.KEYWORD3);
242
                                                lastOffset = lastKeyword = i+2;
243
                                                i++;
244
                                        }
245
                                        break;
246
                                case '/': case '?':
247
                                        if(doKeyword(line,i,c))
248
                                                break;
249
                                        if(length - i > 1)
250
                                        {
251
                                                backslash = false;
252
                                                char ch = array[i1];
253
                                                if(Character.isWhitespace(ch))
254
                                                        break;
255
                                                matchChar = c;
256
                                                matchSpacesAllowed = false;
257
                                                addToken(i - lastOffset,token);
258
                                                token = S_ONE;
259
                                                lastOffset = lastKeyword = i;
260
                                        }
261
                                        break;
262
                                default:
263
                                        backslash = false;
264
                                        if(!Character.isLetterOrDigit(c)
265
                                                && c != '_')
266
                                                doKeyword(line,i,c);
267
                                        break;
268
                                }
269
                                break;
270
                        case Token.KEYWORD2:
271
                                backslash = false;
272
                                // This test checks for an end-of-variable
273
                                // condition
274
                                if(!Character.isLetterOrDigit(c) && c != '_'
275
                                        && c != '#' && c != '\'' && c != ':'
276
                                        && c != '&')
277
                                {
278
                                        // If this is the first character
279
                                        // of the variable name ($'aaa)
280
                                        // ignore it
281
                                        if(i != offset && array[i-1] == '$')
282
                                        {
283
                                                addToken(i1 - lastOffset,token);
284
                                                lastOffset = lastKeyword = i1;
285
                                        }
286
                                        // Otherwise, end of variable...
287
                                        else
288
                                        {
289
                                                addToken(i - lastOffset,token);
290
                                                lastOffset = lastKeyword = i;
291
                                                // Wind back so that stuff
292
                                                // like $hello$fred is picked
293
                                                // up
294
                                                i--;
295
                                                token = Token.NULL;
296
                                        }
297
                                }
298
                                break;
299
                        case S_ONE: case S_TWO:
300
                                if(backslash)
301
                                        backslash = false;
302
                                else
303
                                {
304
                                        if(matchChar == '\0')
305
                                        {
306
                                                if(Character.isWhitespace(matchChar)
307
                                                        && !matchSpacesAllowed)
308
                                                        break;
309
                                                else
310
                                                        matchChar = c;
311
                                        }
312
                                        else
313
                                        {
314
                                                switch(matchChar)
315
                                                {
316
                                                case '(':
317
                                                        matchChar = ')';
318
                                                        matchCharBracket = true;
319
                                                        break;
320
                                                case '[':
321
                                                        matchChar = ']';
322
                                                        matchCharBracket = true;
323
                                                        break;
324
                                                case '{':
325
                                                        matchChar = '}';
326
                                                        matchCharBracket = true;
327
                                                        break;
328
                                                case '<':
329
                                                        matchChar = '>';
330
                                                        matchCharBracket = true;
331
                                                        break;
332
                                                default:
333
                                                        matchCharBracket = false;
334
                                                        break;
335
                                                }
336
                                                if(c != matchChar)
337
                                                        break;
338
                                                if(token == S_TWO)
339
                                                {
340
                                                        token = S_ONE;
341
                                                        if(matchCharBracket)
342
                                                                matchChar = '\0';
343
                                                }
344
                                                else
345
                                                {
346
                                                        token = S_END;
347
                                                        addToken(i1 - lastOffset,
348
                                                                Token.LITERAL2);
349
                                                        lastOffset = lastKeyword = i1;
350
                                                }
351
                                        }
352
                                }
353
                                break;
354
                        case S_END:
355
                                backslash = false;
356
                                if(!Character.isLetterOrDigit(c)
357
                                        && c != '_')
358
                                        doKeyword(line,i,c);
359
                                break;
360
                        case Token.COMMENT2:
361
                                backslash = false;
362
                                if(i == offset)
363
                                {
364
                                        addToken(line.count,token);
365
                                        if(length - i > 3 && SyntaxUtilities
366
                                                .regionMatches(false,line,offset,"=cut"))
367
                                                token = Token.NULL;
368
                                        lastOffset = lastKeyword = length;
369
                                        break loop;
370
                                }
371
                                break;
372
                        case Token.LITERAL1:
373
                                if(backslash)
374
                                        backslash = false;
375
                                /* else if(c == '$')
376
                                        backslash = true; */
377
                                else if(c == '"')
378
                                {
379
                                        addToken(i1 - lastOffset,token);
380
                                        token = Token.NULL;
381
                                        lastOffset = lastKeyword = i1;
382
                                }
383
                                break;
384
                        case Token.LITERAL2:
385
                                if(backslash)
386
                                        backslash = false;
387
                                /* else if(c == '$')
388
                                        backslash = true; */
389
                                else if(c == '\'')
390
                                {
391
                                        addToken(i1 - lastOffset,Token.LITERAL1);
392
                                        token = Token.NULL;
393
                                        lastOffset = lastKeyword = i1;
394
                                }
395
                                break;
396
                        case Token.OPERATOR:
397
                                if(backslash)
398
                                        backslash = false;
399
                                else if(c == '`')
400
                                {
401
                                        addToken(i1 - lastOffset,token);
402
                                        token = Token.NULL;
403
                                        lastOffset = lastKeyword = i1;
404
                                }
405
                                break;
406
                        default:
407
                                throw new InternalError("Invalid state: "
408
                                        + token);
409
                        }
410
                }
411

    
412
                if(token == Token.NULL)
413
                        doKeyword(line,length,'\0');
414

    
415
                switch(token)
416
                {
417
                case Token.KEYWORD2:
418
                        addToken(length - lastOffset,token);
419
                        token = Token.NULL;
420
                        break;
421
                case Token.LITERAL2:
422
                        addToken(length - lastOffset,Token.LITERAL1);
423
                        break;
424
                case S_END:
425
                        addToken(length - lastOffset,Token.LITERAL2);
426
                        token = Token.NULL;
427
                        break;
428
                case S_ONE: case S_TWO:
429
                        addToken(length - lastOffset,Token.INVALID); // XXX
430
                        token = Token.NULL;
431
                        break;
432
                default:
433
                        addToken(length - lastOffset,token);
434
                        break;
435
                }
436
                return token;
437
        }
438

    
439
        // private members
440
        private KeywordMap keywords;
441
        private byte token;
442
        private int lastOffset;
443
        private int lastKeyword;
444
        private char matchChar;
445
        private boolean matchCharBracket;
446
        private boolean matchSpacesAllowed;
447

    
448
        private boolean doKeyword(Segment line, int i, char c)
449
        {
450
                int i1 = i+1;
451

    
452
                if(token == S_END)
453
                {
454
                        addToken(i - lastOffset,Token.LITERAL2);
455
                        token = Token.NULL;
456
                        lastOffset = i;
457
                        lastKeyword = i1;
458
                        return false;
459
                }
460

    
461
                int len = i - lastKeyword;
462
                byte id = keywords.lookup(line,lastKeyword,len);
463
                if(id == S_ONE || id == S_TWO)
464
                {
465
                        if(lastKeyword != lastOffset)
466
                                addToken(lastKeyword - lastOffset,Token.NULL);
467
                        addToken(len,Token.LITERAL2);
468
                        lastOffset = i;
469
                        lastKeyword = i1;
470
                        if(Character.isWhitespace(c))
471
                                matchChar = '\0';
472
                        else
473
                                matchChar = c;
474
                        matchSpacesAllowed = true;
475
                        token = id;
476
                        return true;
477
                }
478
                else if(id != Token.NULL)
479
                {
480
                        if(lastKeyword != lastOffset)
481
                                addToken(lastKeyword - lastOffset,Token.NULL);
482
                        addToken(len,id);
483
                        lastOffset = i;
484
                }
485
                lastKeyword = i1;
486
                return false;
487
        }
488

    
489
        // Converts < EOF >, < 'EOF' >, etc to <EOF>
490
        private String createReadinString(char[] array, int start, int len)
491
        {
492
                int idx1 = start;
493
                int idx2 = start + len - 1;
494

    
495
                while((idx1 <= idx2) && (!Character.isLetterOrDigit(array[idx1])))
496
                        idx1++;
497

    
498
                while((idx1 <= idx2) && (!Character.isLetterOrDigit(array[idx2])))
499
                        idx2--;
500

    
501
                return new String(array, idx1, idx2 - idx1 + 1);
502
        }
503

    
504
        private static KeywordMap perlKeywords;
505

    
506
        private static KeywordMap getKeywords()
507
        {
508
                if(perlKeywords == null)
509
                {
510
                        perlKeywords = new KeywordMap(false);
511
                        perlKeywords.add("my",Token.KEYWORD1);
512
                        perlKeywords.add("local",Token.KEYWORD1);
513
                        perlKeywords.add("new",Token.KEYWORD1);
514
                        perlKeywords.add("if",Token.KEYWORD1);
515
                        perlKeywords.add("until",Token.KEYWORD1);
516
                        perlKeywords.add("while",Token.KEYWORD1);
517
                        perlKeywords.add("elsif",Token.KEYWORD1);
518
                        perlKeywords.add("else",Token.KEYWORD1);
519
                        perlKeywords.add("eval",Token.KEYWORD1);
520
                        perlKeywords.add("unless",Token.KEYWORD1);
521
                        perlKeywords.add("foreach",Token.KEYWORD1);
522
                        perlKeywords.add("continue",Token.KEYWORD1);
523
                        perlKeywords.add("exit",Token.KEYWORD1);
524
                        perlKeywords.add("die",Token.KEYWORD1);
525
                        perlKeywords.add("last",Token.KEYWORD1);
526
                        perlKeywords.add("goto",Token.KEYWORD1);
527
                        perlKeywords.add("next",Token.KEYWORD1);
528
                        perlKeywords.add("redo",Token.KEYWORD1);
529
                        perlKeywords.add("goto",Token.KEYWORD1);
530
                        perlKeywords.add("return",Token.KEYWORD1);
531
                        perlKeywords.add("do",Token.KEYWORD1);
532
                        perlKeywords.add("sub",Token.KEYWORD1);
533
                        perlKeywords.add("use",Token.KEYWORD1);
534
                        perlKeywords.add("require",Token.KEYWORD1);
535
                        perlKeywords.add("package",Token.KEYWORD1);
536
                        perlKeywords.add("BEGIN",Token.KEYWORD1);
537
                        perlKeywords.add("END",Token.KEYWORD1);
538
                        perlKeywords.add("eq",Token.OPERATOR);
539
                        perlKeywords.add("ne",Token.OPERATOR);
540
                        perlKeywords.add("not",Token.OPERATOR);
541
                        perlKeywords.add("and",Token.OPERATOR);
542
                        perlKeywords.add("or",Token.OPERATOR);
543

    
544
                        perlKeywords.add("abs",Token.KEYWORD3);
545
                        perlKeywords.add("accept",Token.KEYWORD3);
546
                        perlKeywords.add("alarm",Token.KEYWORD3);
547
                        perlKeywords.add("atan2",Token.KEYWORD3);
548
                        perlKeywords.add("bind",Token.KEYWORD3);
549
                        perlKeywords.add("binmode",Token.KEYWORD3);
550
                        perlKeywords.add("bless",Token.KEYWORD3);
551
                        perlKeywords.add("caller",Token.KEYWORD3);
552
                        perlKeywords.add("chdir",Token.KEYWORD3);
553
                        perlKeywords.add("chmod",Token.KEYWORD3);
554
                        perlKeywords.add("chomp",Token.KEYWORD3);
555
                        perlKeywords.add("chr",Token.KEYWORD3);
556
                        perlKeywords.add("chroot",Token.KEYWORD3);
557
                        perlKeywords.add("chown",Token.KEYWORD3);
558
                        perlKeywords.add("closedir",Token.KEYWORD3);
559
                        perlKeywords.add("close",Token.KEYWORD3);
560
                        perlKeywords.add("connect",Token.KEYWORD3);
561
                        perlKeywords.add("cos",Token.KEYWORD3);
562
                        perlKeywords.add("crypt",Token.KEYWORD3);
563
                        perlKeywords.add("dbmclose",Token.KEYWORD3);
564
                        perlKeywords.add("dbmopen",Token.KEYWORD3);
565
                        perlKeywords.add("defined",Token.KEYWORD3);
566
                        perlKeywords.add("delete",Token.KEYWORD3);
567
                        perlKeywords.add("die",Token.KEYWORD3);
568
                        perlKeywords.add("dump",Token.KEYWORD3);
569
                        perlKeywords.add("each",Token.KEYWORD3);
570
                        perlKeywords.add("endgrent",Token.KEYWORD3);
571
                        perlKeywords.add("endhostent",Token.KEYWORD3);
572
                        perlKeywords.add("endnetent",Token.KEYWORD3);
573
                        perlKeywords.add("endprotoent",Token.KEYWORD3);
574
                        perlKeywords.add("endpwent",Token.KEYWORD3);
575
                        perlKeywords.add("endservent",Token.KEYWORD3);
576
                        perlKeywords.add("eof",Token.KEYWORD3);
577
                        perlKeywords.add("exec",Token.KEYWORD3);
578
                        perlKeywords.add("exists",Token.KEYWORD3);
579
                        perlKeywords.add("exp",Token.KEYWORD3);
580
                        perlKeywords.add("fctnl",Token.KEYWORD3);
581
                        perlKeywords.add("fileno",Token.KEYWORD3);
582
                        perlKeywords.add("flock",Token.KEYWORD3);
583
                        perlKeywords.add("fork",Token.KEYWORD3);
584
                        perlKeywords.add("format",Token.KEYWORD3);
585
                        perlKeywords.add("formline",Token.KEYWORD3);
586
                        perlKeywords.add("getc",Token.KEYWORD3);
587
                        perlKeywords.add("getgrent",Token.KEYWORD3);
588
                        perlKeywords.add("getgrgid",Token.KEYWORD3);
589
                        perlKeywords.add("getgrnam",Token.KEYWORD3);
590
                        perlKeywords.add("gethostbyaddr",Token.KEYWORD3);
591
                        perlKeywords.add("gethostbyname",Token.KEYWORD3);
592
                        perlKeywords.add("gethostent",Token.KEYWORD3);
593
                        perlKeywords.add("getlogin",Token.KEYWORD3);
594
                        perlKeywords.add("getnetbyaddr",Token.KEYWORD3);
595
                        perlKeywords.add("getnetbyname",Token.KEYWORD3);
596
                        perlKeywords.add("getnetent",Token.KEYWORD3);
597
                        perlKeywords.add("getpeername",Token.KEYWORD3);
598
                        perlKeywords.add("getpgrp",Token.KEYWORD3);
599
                        perlKeywords.add("getppid",Token.KEYWORD3);
600
                        perlKeywords.add("getpriority",Token.KEYWORD3);
601
                        perlKeywords.add("getprotobyname",Token.KEYWORD3);
602
                        perlKeywords.add("getprotobynumber",Token.KEYWORD3);
603
                        perlKeywords.add("getprotoent",Token.KEYWORD3);
604
                        perlKeywords.add("getpwent",Token.KEYWORD3);
605
                        perlKeywords.add("getpwnam",Token.KEYWORD3);
606
                        perlKeywords.add("getpwuid",Token.KEYWORD3);
607
                        perlKeywords.add("getservbyname",Token.KEYWORD3);
608
                        perlKeywords.add("getservbyport",Token.KEYWORD3);
609
                        perlKeywords.add("getservent",Token.KEYWORD3);
610
                        perlKeywords.add("getsockname",Token.KEYWORD3);
611
                        perlKeywords.add("getsockopt",Token.KEYWORD3);
612
                        perlKeywords.add("glob",Token.KEYWORD3);
613
                        perlKeywords.add("gmtime",Token.KEYWORD3);
614
                        perlKeywords.add("grep",Token.KEYWORD3);
615
                        perlKeywords.add("hex",Token.KEYWORD3);
616
                        perlKeywords.add("import",Token.KEYWORD3);
617
                        perlKeywords.add("index",Token.KEYWORD3);
618
                        perlKeywords.add("int",Token.KEYWORD3);
619
                        perlKeywords.add("ioctl",Token.KEYWORD3);
620
                        perlKeywords.add("join",Token.KEYWORD3);
621
                        perlKeywords.add("keys",Token.KEYWORD3);
622
                        perlKeywords.add("kill",Token.KEYWORD3);
623
                        perlKeywords.add("lcfirst",Token.KEYWORD3);
624
                        perlKeywords.add("lc",Token.KEYWORD3);
625
                        perlKeywords.add("length",Token.KEYWORD3);
626
                        perlKeywords.add("link",Token.KEYWORD3);
627
                        perlKeywords.add("listen",Token.KEYWORD3);
628
                        perlKeywords.add("log",Token.KEYWORD3);
629
                        perlKeywords.add("localtime",Token.KEYWORD3);
630
                        perlKeywords.add("lstat",Token.KEYWORD3);
631
                        perlKeywords.add("map",Token.KEYWORD3);
632
                        perlKeywords.add("mkdir",Token.KEYWORD3);
633
                        perlKeywords.add("msgctl",Token.KEYWORD3);
634
                        perlKeywords.add("msgget",Token.KEYWORD3);
635
                        perlKeywords.add("msgrcv",Token.KEYWORD3);
636
                        perlKeywords.add("no",Token.KEYWORD3);
637
                        perlKeywords.add("oct",Token.KEYWORD3);
638
                        perlKeywords.add("opendir",Token.KEYWORD3);
639
                        perlKeywords.add("open",Token.KEYWORD3);
640
                        perlKeywords.add("ord",Token.KEYWORD3);
641
                        perlKeywords.add("pack",Token.KEYWORD3);
642
                        perlKeywords.add("pipe",Token.KEYWORD3);
643
                        perlKeywords.add("pop",Token.KEYWORD3);
644
                        perlKeywords.add("pos",Token.KEYWORD3);
645
                        perlKeywords.add("printf",Token.KEYWORD3);
646
                        perlKeywords.add("print",Token.KEYWORD3);
647
                        perlKeywords.add("push",Token.KEYWORD3);
648
                        perlKeywords.add("quotemeta",Token.KEYWORD3);
649
                        perlKeywords.add("rand",Token.KEYWORD3);
650
                        perlKeywords.add("readdir",Token.KEYWORD3);
651
                        perlKeywords.add("read",Token.KEYWORD3);
652
                        perlKeywords.add("readlink",Token.KEYWORD3);
653
                        perlKeywords.add("recv",Token.KEYWORD3);
654
                        perlKeywords.add("ref",Token.KEYWORD3);
655
                        perlKeywords.add("rename",Token.KEYWORD3);
656
                        perlKeywords.add("reset",Token.KEYWORD3);
657
                        perlKeywords.add("reverse",Token.KEYWORD3);
658
                        perlKeywords.add("rewinddir",Token.KEYWORD3);
659
                        perlKeywords.add("rindex",Token.KEYWORD3);
660
                        perlKeywords.add("rmdir",Token.KEYWORD3);
661
                        perlKeywords.add("scalar",Token.KEYWORD3);
662
                        perlKeywords.add("seekdir",Token.KEYWORD3);
663
                        perlKeywords.add("seek",Token.KEYWORD3);
664
                        perlKeywords.add("select",Token.KEYWORD3);
665
                        perlKeywords.add("semctl",Token.KEYWORD3);
666
                        perlKeywords.add("semget",Token.KEYWORD3);
667
                        perlKeywords.add("semop",Token.KEYWORD3);
668
                        perlKeywords.add("send",Token.KEYWORD3);
669
                        perlKeywords.add("setgrent",Token.KEYWORD3);
670
                        perlKeywords.add("sethostent",Token.KEYWORD3);
671
                        perlKeywords.add("setnetent",Token.KEYWORD3);
672
                        perlKeywords.add("setpgrp",Token.KEYWORD3);
673
                        perlKeywords.add("setpriority",Token.KEYWORD3);
674
                        perlKeywords.add("setprotoent",Token.KEYWORD3);
675
                        perlKeywords.add("setpwent",Token.KEYWORD3);
676
                        perlKeywords.add("setsockopt",Token.KEYWORD3);
677
                        perlKeywords.add("shift",Token.KEYWORD3);
678
                        perlKeywords.add("shmctl",Token.KEYWORD3);
679
                        perlKeywords.add("shmget",Token.KEYWORD3);
680
                        perlKeywords.add("shmread",Token.KEYWORD3);
681
                        perlKeywords.add("shmwrite",Token.KEYWORD3);
682
                        perlKeywords.add("shutdown",Token.KEYWORD3);
683
                        perlKeywords.add("sin",Token.KEYWORD3);
684
                        perlKeywords.add("sleep",Token.KEYWORD3);
685
                        perlKeywords.add("socket",Token.KEYWORD3);
686
                        perlKeywords.add("socketpair",Token.KEYWORD3);
687
                        perlKeywords.add("sort",Token.KEYWORD3);
688
                        perlKeywords.add("splice",Token.KEYWORD3);
689
                        perlKeywords.add("split",Token.KEYWORD3);
690
                        perlKeywords.add("sprintf",Token.KEYWORD3);
691
                        perlKeywords.add("sqrt",Token.KEYWORD3);
692
                        perlKeywords.add("srand",Token.KEYWORD3);
693
                        perlKeywords.add("stat",Token.KEYWORD3);
694
                        perlKeywords.add("study",Token.KEYWORD3);
695
                        perlKeywords.add("substr",Token.KEYWORD3);
696
                        perlKeywords.add("symlink",Token.KEYWORD3);
697
                        perlKeywords.add("syscall",Token.KEYWORD3);
698
                        perlKeywords.add("sysopen",Token.KEYWORD3);
699
                        perlKeywords.add("sysread",Token.KEYWORD3);
700
                        perlKeywords.add("syswrite",Token.KEYWORD3);
701
                        perlKeywords.add("telldir",Token.KEYWORD3);
702
                        perlKeywords.add("tell",Token.KEYWORD3);
703
                        perlKeywords.add("tie",Token.KEYWORD3);
704
                        perlKeywords.add("tied",Token.KEYWORD3);
705
                        perlKeywords.add("time",Token.KEYWORD3);
706
                        perlKeywords.add("times",Token.KEYWORD3);
707
                        perlKeywords.add("truncate",Token.KEYWORD3);
708
                        perlKeywords.add("uc",Token.KEYWORD3);
709
                        perlKeywords.add("ucfirst",Token.KEYWORD3);
710
                        perlKeywords.add("umask",Token.KEYWORD3);
711
                        perlKeywords.add("undef",Token.KEYWORD3);
712
                        perlKeywords.add("unlink",Token.KEYWORD3);
713
                        perlKeywords.add("unpack",Token.KEYWORD3);
714
                        perlKeywords.add("unshift",Token.KEYWORD3);
715
                        perlKeywords.add("untie",Token.KEYWORD3);
716
                        perlKeywords.add("utime",Token.KEYWORD3);
717
                        perlKeywords.add("values",Token.KEYWORD3);
718
                        perlKeywords.add("vec",Token.KEYWORD3);
719
                        perlKeywords.add("wait",Token.KEYWORD3);
720
                        perlKeywords.add("waitpid",Token.KEYWORD3);
721
                        perlKeywords.add("wantarray",Token.KEYWORD3);
722
                        perlKeywords.add("warn",Token.KEYWORD3);
723
                        perlKeywords.add("write",Token.KEYWORD3);
724

    
725
                        perlKeywords.add("m",S_ONE);
726
                        perlKeywords.add("q",S_ONE);
727
                        perlKeywords.add("qq",S_ONE);
728
                        perlKeywords.add("qw",S_ONE);
729
                        perlKeywords.add("qx",S_ONE);
730
                        perlKeywords.add("s",S_TWO);
731
                        perlKeywords.add("tr",S_TWO);
732
                        perlKeywords.add("y",S_TWO);
733
                }
734
                return perlKeywords;
735
        }        
736
}