source: other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex@ 25584

Last change on this file since 25584 was 25584, checked in by davidb, 12 years ago

Initial cut an a text edit area for GLI that supports color syntax highlighting

File size: 43.1 KB
Line 
1/*
2 * 02/11/2008
3 *
4 * JSPTokenMaker.java - Generates tokens for JSP syntax highlighting.
5 *
6 * This library is distributed under a modified BSD license. See the included
7 * RSyntaxTextArea.License.txt file for details.
8 */
9package org.fife.ui.rsyntaxtextarea.modes;
10
11import java.io.*;
12import javax.swing.text.Segment;
13
14import org.fife.ui.rsyntaxtextarea.*;
15
16
17/**
18 * Scanner for JSP files (supporting HTML 5).
19 *
20 * This implementation was created using
21 * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
22 * was modified for performance. Memory allocation needs to be almost
23 * completely removed to be competitive with the handwritten lexers (subclasses
24 * of <code>AbstractTokenMaker</code>, so this class has been modified so that
25 * Strings are never allocated (via yytext()), and the scanner never has to
26 * worry about refilling its buffer (needlessly copying chars around).
27 * We can achieve this because RText always scans exactly 1 line of tokens at a
28 * time, and hands the scanner this line as an array of characters (a Segment
29 * really). Since tokens contain pointers to char arrays instead of Strings
30 * holding their contents, there is no need for allocating new memory for
31 * Strings.<p>
32 *
33 * The actual algorithm generated for scanning has, of course, not been
34 * modified.<p>
35 *
36 * If you wish to regenerate this file yourself, keep in mind the following:
37 * <ul>
38 * <li>The generated JSPTokenMaker.java</code> file will contain two
39 * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
40 * You should hand-delete the second of each definition (the ones
41 * generated by the lexer), as these generated methods modify the input
42 * buffer, which we'll never have to do.</li>
43 * <li>You should also change the declaration/definition of zzBuffer to NOT
44 * be initialized. This is a needless memory allocation for us since we
45 * will be pointing the array somewhere else anyway.</li>
46 * <li>You should NOT call <code>yylex()</code> on the generated scanner
47 * directly; rather, you should use <code>getTokenList</code> as you would
48 * with any other <code>TokenMaker</code> instance.</li>
49 * </ul>
50 *
51 * @author Robert Futrell
52 * @version 0.8
53 *
54 */
55%%
56
57%public
58%class JSPTokenMaker
59%extends AbstractMarkupTokenMaker
60%unicode
61%type org.fife.ui.rsyntaxtextarea.Token
62
63
64%{
65
66 /**
67 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
68 * double-quote attribute.
69 */
70 public static final int INTERNAL_ATTR_DOUBLE = -1;
71
72
73 /**
74 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
75 * single-quote attribute.
76 */
77 public static final int INTERNAL_ATTR_SINGLE = -2;
78
79
80 /**
81 * Token type specific to JSPTokenMaker; this signals that the user has
82 * ended a line with an unclosed HTML tag; thus a new line is beginning
83 * still inside of the tag.
84 */
85 public static final int INTERNAL_INTAG = -3;
86
87 /**
88 * Token type specific to JSPTokenMaker; this signals that the user has
89 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
90 */
91 public static final int INTERNAL_INTAG_SCRIPT = -4;
92
93 /**
94 * Token type specifying we're in a double-qouted attribute in a
95 * script tag.
96 */
97 public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
98
99 /**
100 * Token type specifying we're in a single-qouted attribute in a
101 * script tag.
102 */
103 public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
104
105 /**
106 * Token type specifying we're in a JSP hidden comment ("<%-- ... --%>").
107 */
108 public static final int INTERNAL_IN_HIDDEN_COMMENT = -7;
109
110 /**
111 * Token type specifying we're in a JSP directive (either include, page
112 * or taglib).
113 */
114 public static final int INTERNAL_IN_JSP_DIRECTIVE = -8;
115
116 /**
117 * Token type specifying we're in JavaScript.
118 */
119 public static final int INTERNAL_IN_JS = -9;
120
121 /**
122 * Token type specifying we're in a JavaScript multiline comment.
123 */
124 public static final int INTERNAL_IN_JS_MLC = -10;
125
126 /**
127 * Token type specifying we're in an invalid multi-line JS string.
128 */
129 public static final int INTERNAL_IN_JS_STRING_INVALID = -11;
130
131 /**
132 * Token type specifying we're in a valid multi-line JS string.
133 */
134 public static final int INTERNAL_IN_JS_STRING_VALID = -12;
135
136 /**
137 * Token type specifying we're in an invalid multi-line JS single-quoted string.
138 */
139 public static final int INTERNAL_IN_JS_CHAR_INVALID = -13;
140
141 /**
142 * Token type specifying we're in a valid multi-line JS single-quoted string.
143 */
144 public static final int INTERNAL_IN_JS_CHAR_VALID = -14;
145
146 /**
147 * Token type specifying we're in a Java documentation comment.
148 */
149 public static final int INTERNAL_IN_JAVA_DOCCOMMENT = -(1<<11);
150
151 /**
152 * Token type specifying we're in Java code.
153 */
154 public static final int INTERNAL_IN_JAVA_EXPRESSION = -(2<<11);
155
156 /**
157 * Token type specifying we're in Java multiline comment.
158 */
159 public static final int INTERNAL_IN_JAVA_MLC = -(3<<11);
160
161 /**
162 * The state JSP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
163 */
164 private int jspInState;
165
166 /**
167 * Whether closing markup tags are automatically completed for JSP.
168 */
169 private static boolean completeCloseTags;
170
171 /**
172 * When in the JS_STRING state, whether the current string is valid.
173 */
174 private boolean validJSString;
175
176
177 /**
178 * Constructor. This must be here because JFlex does not generate a
179 * no-parameter constructor.
180 */
181 public JSPTokenMaker() {
182 super();
183 }
184
185
186 /**
187 * Adds the token specified to the current linked list of tokens as an
188 * "end token;" that is, at <code>zzMarkedPos</code>.
189 *
190 * @param tokenType The token's type.
191 */
192 private void addEndToken(int tokenType) {
193 addToken(zzMarkedPos,zzMarkedPos, tokenType);
194 }
195
196
197 /**
198 * Adds the token specified to the current linked list of tokens.
199 *
200 * @param tokenType The token's type.
201 * @see #addToken(int, int, int)
202 */
203 private void addHyperlinkToken(int start, int end, int tokenType) {
204 int so = start + offsetShift;
205 addToken(zzBuffer, start,end, tokenType, so, true);
206 }
207
208
209 /**
210 * Adds the token specified to the current linked list of tokens.
211 *
212 * @param tokenType The token's type.
213 */
214 private void addToken(int tokenType) {
215 addToken(zzStartRead, zzMarkedPos-1, tokenType);
216 }
217
218
219 /**
220 * Adds the token specified to the current linked list of tokens.
221 *
222 * @param tokenType The token's type.
223 */
224 private void addToken(int start, int end, int tokenType) {
225 int so = start + offsetShift;
226 addToken(zzBuffer, start,end, tokenType, so);
227 }
228
229
230 /**
231 * Adds the token specified to the current linked list of tokens.
232 *
233 * @param array The character array.
234 * @param start The starting offset in the array.
235 * @param end The ending offset in the array.
236 * @param tokenType The token's type.
237 * @param startOffset The offset in the document at which this token
238 * occurs.
239 */
240 public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
241 super.addToken(array, start,end, tokenType, startOffset);
242 zzStartRead = zzMarkedPos;
243 }
244
245
246 /**
247 * Sets whether markup close tags should be completed. You might not want
248 * this to be the case, since some tags in standard HTML aren't usually
249 * closed.
250 *
251 * @return Whether closing markup tags are completed.
252 * @see #setCompleteCloseTags(boolean)
253 */
254 public boolean getCompleteCloseTags() {
255 return completeCloseTags;
256 }
257
258
259 /**
260 * Returns the first token in the linked list of tokens generated
261 * from <code>text</code>. This method must be implemented by
262 * subclasses so they can correctly implement syntax highlighting.
263 *
264 * @param text The text from which to get tokens.
265 * @param initialTokenType The token type we should start with.
266 * @param startOffset The offset into the document at which
267 * <code>text</code> starts.
268 * @return The first <code>Token</code> in a linked list representing
269 * the syntax highlighted text.
270 */
271 public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
272
273 resetTokenList();
274 this.offsetShift = -text.offset + startOffset;
275 jspInState = YYINITIAL; // Shouldn't be necessary
276
277 // Start off in the proper state.
278 int state = Token.NULL;
279 switch (initialTokenType) {
280 case Token.COMMENT_MULTILINE:
281 state = COMMENT;
282 start = text.offset;
283 break;
284 case Token.PREPROCESSOR:
285 state = PI;
286 start = text.offset;
287 break;
288 case Token.VARIABLE:
289 state = DTD;
290 start = text.offset;
291 break;
292 case INTERNAL_INTAG:
293 state = INTAG;
294 start = text.offset;
295 break;
296 case INTERNAL_INTAG_SCRIPT:
297 state = INTAG_SCRIPT;
298 start = text.offset;
299 break;
300 case INTERNAL_ATTR_DOUBLE:
301 state = INATTR_DOUBLE;
302 start = text.offset;
303 break;
304 case INTERNAL_ATTR_SINGLE:
305 state = INATTR_SINGLE;
306 start = text.offset;
307 break;
308 case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
309 state = INATTR_DOUBLE_SCRIPT;
310 start = text.offset;
311 break;
312 case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
313 state = INATTR_SINGLE_SCRIPT;
314 start = text.offset;
315 break;
316 case INTERNAL_IN_HIDDEN_COMMENT:
317 state = HIDDEN_COMMENT;
318 start = text.offset;
319 break;
320 case INTERNAL_IN_JSP_DIRECTIVE:
321 state = JSP_DIRECTIVE;
322 start = text.offset;
323 break;
324 case INTERNAL_IN_JS:
325 state = JAVASCRIPT;
326 start = text.offset;
327 break;
328 case INTERNAL_IN_JS_MLC:
329 state = JS_MLC;
330 start = text.offset;
331 break;
332 case INTERNAL_IN_JS_STRING_INVALID:
333 state = JS_STRING;
334 validJSString = false;
335 start = text.offset;
336 break;
337 case INTERNAL_IN_JS_STRING_VALID:
338 state = JS_STRING;
339 validJSString = true;
340 start = text.offset;
341 break;
342 case INTERNAL_IN_JS_CHAR_INVALID:
343 state = JS_CHAR;
344 validJSString = false;
345 start = text.offset;
346 break;
347 case INTERNAL_IN_JS_CHAR_VALID:
348 state = JS_CHAR;
349 validJSString = true;
350 start = text.offset;
351 break;
352 default:
353 if (initialTokenType<-1024) { // INTERNAL_IN_JAVAxxx - jspInState
354 int main = -(-initialTokenType & 0xffffff00);
355 switch (main) {
356 default: // Should never happen
357 case INTERNAL_IN_JAVA_DOCCOMMENT:
358 state = JAVA_DOCCOMMENT;
359 start = text.offset;
360 break;
361 case INTERNAL_IN_JAVA_EXPRESSION:
362 state = JAVA_EXPRESSION;
363 start = text.offset;
364 break;
365 case INTERNAL_IN_JAVA_MLC:
366 state = JAVA_MLC;
367 start = text.offset;
368 break;
369 }
370 jspInState = -initialTokenType&0xff;
371 }
372 else {
373 state = Token.NULL;
374 }
375 break;
376 }
377
378 s = text;
379 try {
380 yyreset(zzReader);
381 yybegin(state);
382 return yylex();
383 } catch (IOException ioe) {
384 ioe.printStackTrace();
385 return new DefaultToken();
386 }
387
388 }
389
390
391 /**
392 * Sets whether markup close tags should be completed. You might not want
393 * this to be the case, since some tags in standard HTML aren't usually
394 * closed.
395 *
396 * @param complete Whether closing markup tags are completed.
397 * @see #getCompleteCloseTags()
398 */
399 public static void setCompleteCloseTags(boolean complete) {
400 completeCloseTags = complete;
401 }
402
403
404 /**
405 * Refills the input buffer.
406 *
407 * @return <code>true</code> if EOF was reached, otherwise
408 * <code>false</code>.
409 */
410 private boolean zzRefill() {
411 return zzCurrentPos>=s.offset+s.count;
412 }
413
414
415 /**
416 * Resets the scanner to read from a new input stream.
417 * Does not close the old reader.
418 *
419 * All internal variables are reset, the old input stream
420 * <b>cannot</b> be reused (internal buffer is discarded and lost).
421 * Lexical state is set to <tt>YY_INITIAL</tt>.
422 *
423 * @param reader the new input stream
424 */
425 public final void yyreset(java.io.Reader reader) {
426 // 's' has been updated.
427 zzBuffer = s.array;
428 /*
429 * We replaced the line below with the two below it because zzRefill
430 * no longer "refills" the buffer (since the way we do it, it's always
431 * "full" the first time through, since it points to the segment's
432 * array). So, we assign zzEndRead here.
433 */
434 //zzStartRead = zzEndRead = s.offset;
435 zzStartRead = s.offset;
436 zzEndRead = zzStartRead + s.count - 1;
437 zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
438 zzLexicalState = YYINITIAL;
439 zzReader = reader;
440 zzAtBOL = true;
441 zzAtEOF = false;
442 }
443
444
445%}
446
447// HTML-specific stuff.
448Whitespace = ([ \t\f])
449LineTerminator = ([\n])
450Identifier = ([^ \t\n<&]+)
451AmperItem = ([&][^; \t]*[;]?)
452InTagIdentifier = ([^ \t\n\"\'/=>]+)
453UnclosedStringLiteral = ([\"][^\"]*)
454StringLiteral = ({UnclosedStringLiteral}[\"])
455UnclosedCharLiteral = ([\'][^\']*)
456CharLiteral = ({UnclosedCharLiteral}[\'])
457EndScriptTag = ("</" [sS][cC][rR][iI][pP][tT] ">")
458
459JspExpressionStart = ("<%=")
460JspScriptletStart = ("<%")
461JspDeclarationStart = ("<%!")
462JspStart = ({JspExpressionStart}|{JspScriptletStart}|{JspDeclarationStart})
463
464// Java stuff.
465Letter = [A-Za-z]
466LetterOrUnderscore = ({Letter}|"_")
467NonzeroDigit = [1-9]
468Digit = ("0"|{NonzeroDigit})
469HexDigit = ({Digit}|[A-Fa-f])
470OctalDigit = ([0-7])
471AnyCharacterButApostropheOrBackSlash = ([^\\'])
472AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
473EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
474Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
475NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
476IdentifierStart = ({LetterOrUnderscore}|"$")
477IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
478WhiteSpace = ([ \t\f])
479JCharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
480JUnclosedCharLiteral = ([\'][^\'\n]*)
481JErrorCharLiteral = ({UnclosedCharLiteral}[\'])
482JStringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
483JUnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
484JErrorStringLiteral = ({UnclosedStringLiteral}[\"])
485MLCBegin = "/*"
486MLCEnd = "*/"
487DocCommentBegin = "/**"
488LineCommentBegin = "//"
489IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
490IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
491IntegerLiteral = ({IntegerHelper1}[lL]?)
492HexLiteral = ({IntegerHelper2}[lL]?)
493FloatHelper1 = ([fFdD]?)
494FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
495FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
496FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
497FloatLiteral3 = ({Digit}+{FloatHelper2})
498FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
499ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
500BooleanLiteral = ("true"|"false")
501Separator = ([\(\)\{\}\[\]])
502Separator2 = ([\;,.])
503NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
504AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
505Operator = ({NonAssignmentOperator}|{AssignmentOperator})
506DocumentationKeyword = ("author"|"deprecated"|"exception"|"link"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
507JIdentifier = ({IdentifierStart}{IdentifierPart}*)
508ErrorIdentifier = ({NonSeparator}+)
509Annotation = ("@"{JIdentifier}?)
510PrimitiveTypes = ("boolean"|"byte"|"char"|"double" |"float"|"int"|"long"|"short")
511
512CurrentBlockTag = ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
513ProposedBlockTag = ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
514BlockTag = ({CurrentBlockTag}|{ProposedBlockTag})
515InlineTag = ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
516
517URLGenDelim = ([:\/\?#\[\]@])
518URLSubDelim = ([\!\$&'\(\)\*\+,;=])
519URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
520URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
521URLCharacters = ({URLCharacter}*)
522URLEndCharacter = ([\/\$]|{Letter}|{Digit})
523URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
524
525// JavaScript stuff.
526JS_MLCBegin = ({MLCBegin})
527JS_MLCEnd = ({MLCEnd})
528JS_LineCommentBegin = ({LineCommentBegin})
529JS_IntegerLiteral = ({IntegerLiteral})
530JS_HexLiteral = ({HexLiteral})
531JS_FloatLiteral = ({FloatLiteral})
532JS_ErrorNumberFormat = ({ErrorNumberFormat})
533JS_Separator = ({Separator})
534JS_Separator2 = ({Separator2})
535JS_Operator = ({Operator})
536JS_Identifier = ({JIdentifier})
537JS_ErrorIdentifier = ({ErrorIdentifier})
538JS_Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
539
540
541%state COMMENT
542%state PI
543%state DTD
544%state INTAG
545%state INTAG_CHECK_TAG_NAME
546%state INATTR_DOUBLE
547%state INATTR_SINGLE
548%state INTAG_SCRIPT
549%state INATTR_DOUBLE_SCRIPT
550%state INATTR_SINGLE_SCRIPT
551%state JAVASCRIPT
552%state JS_STRING
553%state JS_CHAR
554%state JS_MLC
555%state JS_EOL_COMMENT
556%state HIDDEN_COMMENT
557%state JAVA_DOCCOMMENT
558%state JAVA_EXPRESSION
559%state JAVA_MLC
560%state JSP_DIRECTIVE
561
562
563%%
564
565<YYINITIAL> {
566 "<!--" { start = zzMarkedPos-4; yybegin(COMMENT); }
567 "<"[sS][cC][rR][iI][pP][tT] {
568 addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
569 addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
570 start = zzMarkedPos; yybegin(INTAG_SCRIPT);
571 }
572 "<!" { start = zzMarkedPos-2; yybegin(DTD); }
573 "<?" { start = zzMarkedPos-2; yybegin(PI); }
574 "<%--" { start = zzMarkedPos-4; yybegin(HIDDEN_COMMENT); }
575 {JspStart} { addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
576 "<%@" { addToken(Token.SEPARATOR); yybegin(JSP_DIRECTIVE); }
577 "<"({Letter}|{Digit})+ {
578 int count = yylength();
579 addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
580 zzMarkedPos -= (count-1); //yypushback(count-1);
581 yybegin(INTAG_CHECK_TAG_NAME);
582 }
583 "</"({Letter}|{Digit})+ {
584 int count = yylength();
585 addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
586 zzMarkedPos -= (count-2); //yypushback(count-2);
587 yybegin(INTAG_CHECK_TAG_NAME);
588 }
589 "<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
590 "</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
591 {LineTerminator} { addNullToken(); return firstToken; }
592 {Identifier} { addToken(Token.IDENTIFIER); } // Catches everything.
593 {AmperItem} { addToken(Token.DATA_TYPE); }
594 {Whitespace}+ { addToken(Token.WHITESPACE); }
595 <<EOF>> { addNullToken(); return firstToken; }
596}
597
598<COMMENT> {
599 [^hwf\n\-]+ {}
600 {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
601 [hwf] {}
602 {LineTerminator} { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
603 "-->" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); }
604 "-" {}
605 <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
606}
607
608<HIDDEN_COMMENT> {
609 [^hwf\n\-]+ {}
610 {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
611 [hwf] {}
612 {LineTerminator} { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken; }
613 "--%>" { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_MULTILINE); }
614 "-" {}
615 <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken; }
616}
617
618<PI> {
619 [^\n\?]+ {}
620 {LineTerminator} { addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
621 "?>" { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
622 "?" {}
623 <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
624}
625
626<DTD> {
627 [^\n>]+ {}
628 {LineTerminator} { addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
629 ">" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE); }
630 <<EOF>> { addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
631}
632
633<INTAG_CHECK_TAG_NAME> {
634 [Aa] |
635 [aA][bB][bB][rR] |
636 [aA][cC][rR][oO][nN][yY][mM] |
637 [aA][dD][dD][rR][eE][sS][sS] |
638 [aA][pP][pP][lL][eE][tT] |
639 [aA][rR][eE][aA] |
640 [aA][rR][tT][iI][cC][lL][eE] |
641 [aA][sS][iI][dD][eE] |
642 [aA][uU][dD][iI][oO] |
643 [bB] |
644 [bB][aA][sS][eE] |
645 [bB][aA][sS][eE][fF][oO][nN][tT] |
646 [bB][dD][oO] |
647 [bB][gG][sS][oO][uU][nN][dD] |
648 [bB][iI][gG] |
649 [bB][lL][iI][nN][kK] |
650 [bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
651 [bB][oO][dD][yY] |
652 [bB][rR] |
653 [bB][uU][tT][tT][oO][nN] |
654 [cC][aA][nN][vV][aA][sS] |
655 [cC][aA][pP][tT][iI][oO][nN] |
656 [cC][eE][nN][tT][eE][rR] |
657 [cC][iI][tT][eE] |
658 [cC][oO][dD][eE] |
659 [cC][oO][lL] |
660 [cC][oO][lL][gG][rR][oO][uU][pP] |
661 [cC][oO][mM][mM][aA][nN][dD] |
662 [cC][oO][mM][mM][eE][nN][tT] |
663 [dD][dD] |
664 [dD][aA][tT][aA][gG][rR][iI][dD] |
665 [dD][aA][tT][aA][lL][iI][sS][tT] |
666 [dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
667 [dD][eE][lL] |
668 [dD][eE][tT][aA][iI][lL][sS] |
669 [dD][fF][nN] |
670 [dD][iI][aA][lL][oO][gG] |
671 [dD][iI][rR] |
672 [dD][iI][vV] |
673 [dD][lL] |
674 [dD][tT] |
675 [eE][mM] |
676 [eE][mM][bB][eE][dD] |
677 [eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
678 [fF][iI][eE][lL][dD][sS][eE][tT] |
679 [fF][iI][gG][uU][rR][eE] |
680 [fF][oO][nN][tT] |
681 [fF][oO][oO][tT][eE][rR] |
682 [fF][oO][rR][mM] |
683 [fF][rR][aA][mM][eE] |
684 [fF][rR][aA][mM][eE][sS][eE][tT] |
685 [hH][123456] |
686 [hH][eE][aA][dD] |
687 [hH][eE][aA][dD][eE][rR] |
688 [hH][rR] |
689 [hH][tT][mM][lL] |
690 [iI] |
691 [iI][fF][rR][aA][mM][eE] |
692 [iI][lL][aA][yY][eE][rR] |
693 [iI][mM][gG] |
694 [iI][nN][pP][uU][tT] |
695 [iI][nN][sS] |
696 [iI][sS][iI][nN][dD][eE][xX] |
697 [kK][bB][dD] |
698 [kK][eE][yY][gG][eE][nN] |
699 [lL][aA][bB][eE][lL] |
700 [lL][aA][yY][eE][rR] |
701 [lL][eE][gG][eE][nN][dD] |
702 [lL][iI] |
703 [lL][iI][nN][kK] |
704 [mM][aA][pP] |
705 [mM][aA][rR][kK] |
706 [mM][aA][rR][qQ][uU][eE][eE] |
707 [mM][eE][nN][uU] |
708 [mM][eE][tT][aA] |
709 [mM][eE][tT][eE][rR] |
710 [mM][uU][lL][tT][iI][cC][oO][lL] |
711 [nN][aA][vV] |
712 [nN][eE][sS][tT] |
713 [nN][oO][bB][rR] |
714 [nN][oO][eE][mM][bB][eE][dD] |
715 [nN][oO][fF][rR][aA][mM][eE][sS] |
716 [nN][oO][lL][aA][yY][eE][rR] |
717 [nN][oO][sS][cC][rR][iI][pP][tT] |
718 [oO][bB][jJ][eE][cC][tT] |
719 [oO][lL] |
720 [oO][pP][tT][gG][rR][oO][uU][pP] |
721 [oO][pP][tT][iI][oO][nN] |
722 [oO][uU][tT][pP][uU][tT] |
723 [pP] |
724 [pP][aA][rR][aA][mM] |
725 [pP][lL][aA][iI][nN][tT][eE][xX][tT] |
726 [pP][rR][eE] |
727 [pP][rR][oO][gG][rR][eE][sS][sS] |
728 [qQ] |
729 [rR][uU][lL][eE] |
730 [sS] |
731 [sS][aA][mM][pP] |
732 [sS][cC][rR][iI][pP][tT] |
733 [sS][eE][cC][tT][iI][oO][nN] |
734 [sS][eE][lL][eE][cC][tT] |
735 [sS][eE][rR][vV][eE][rR] |
736 [sS][mM][aA][lL][lL] |
737 [sS][oO][uU][rR][cC][eE] |
738 [sS][pP][aA][cC][eE][rR] |
739 [sS][pP][aA][nN] |
740 [sS][tT][rR][iI][kK][eE] |
741 [sS][tT][rR][oO][nN][gG] |
742 [sS][tT][yY][lL][eE] |
743 [sS][uU][bB] |
744 [sS][uU][pP] |
745 [tT][aA][bB][lL][eE] |
746 [tT][bB][oO][dD][yY] |
747 [tT][dD] |
748 [tT][eE][xX][tT][aA][rR][eE][aA] |
749 [tT][fF][oO][oO][tT] |
750 [tT][hH] |
751 [tT][hH][eE][aA][dD] |
752 [tT][iI][mM][eE] |
753 [tT][iI][tT][lL][eE] |
754 [tT][rR] |
755 [tT][tT] |
756 [uU] |
757 [uU][lL] |
758 [vV][aA][rR] |
759 [vV][iI][dD][eE][oO] { addToken(Token.MARKUP_TAG_NAME); }
760 {InTagIdentifier} { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
761 . { /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
762 <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
763}
764
765<INTAG> {
766 {JspStart} { addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
767 "/" { addToken(Token.MARKUP_TAG_DELIMITER); }
768 {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
769 {Whitespace} { addToken(Token.WHITESPACE); }
770 "=" { addToken(Token.OPERATOR); }
771 "/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
772 ">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
773 [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
774 [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
775 <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
776}
777
778<INATTR_DOUBLE> {
779 {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
780 [^\"<]* {}
781 "<" { /* Allowing JSP expressions, etc. */ }
782 [\"] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
783 <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
784}
785
786<INATTR_SINGLE> {
787 {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
788 [^\'<]* {}
789 "<" { /* Allowing JSP expressions, etc. */ }
790 [\'] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
791 <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
792}
793
794<INTAG_SCRIPT> {
795 {JspStart} { addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
796 {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
797 "/>" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
798 "/" { addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
799 {Whitespace}+ { addToken(Token.WHITESPACE); }
800 "=" { addToken(Token.OPERATOR); }
801 ">" { yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER); }
802 [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
803 [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
804 <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
805}
806
807<INATTR_DOUBLE_SCRIPT> {
808 {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
809 [^\"<]* {}
810 "<" { /* Allowing JSP expressions, etc. */ }
811 [\"] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
812 <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
813}
814
815<INATTR_SINGLE_SCRIPT> {
816 {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
817 [^\'<]* {}
818 "<" { /* Allowing JSP expressions, etc. */ }
819 [\'] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
820 <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
821}
822
823<JAVASCRIPT> {
824
825 {EndScriptTag} {
826 yybegin(YYINITIAL);
827 addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
828 addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
829 addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
830 }
831
832 // ECMA keywords.
833 "break" |
834 "continue" |
835 "delete" |
836 "else" |
837 "for" |
838 "function" |
839 "if" |
840 "in" |
841 "new" |
842 "return" |
843 "this" |
844 "typeof" |
845 "var" |
846 "void" |
847 "while" |
848 "with" { addToken(Token.RESERVED_WORD); }
849
850 // Reserved (but not yet used) ECMA keywords.
851 "abstract" |
852 "case" |
853 "catch" |
854 "class" |
855 "const" |
856 "debugger" |
857 "default" |
858 "do" |
859 "enum" |
860 "export" |
861 "extends" |
862 "final" |
863 "finally" |
864 "goto" |
865 "implements" |
866 "import" |
867 "instanceof" |
868 "interface" |
869 "native" |
870 "package" |
871 "private" |
872 "protected" |
873 "public" |
874 "static" |
875 "super" |
876 "switch" |
877 "synchronized" |
878 "throw" |
879 "throws" |
880 "transient" |
881 "try" |
882 "volatile" |
883 "null" { addToken(Token.RESERVED_WORD); }
884 {PrimitiveTypes} { addToken(Token.DATA_TYPE); }
885
886 // Literals.
887 {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
888 "NaN" { addToken(Token.RESERVED_WORD); }
889 "Infinity" { addToken(Token.RESERVED_WORD); }
890
891 // Functions.
892 "eval" |
893 "parseInt" |
894 "parseFloat" |
895 "escape" |
896 "unescape" |
897 "isNaN" |
898 "isFinite" { addToken(Token.FUNCTION); }
899
900 {LineTerminator} { addEndToken(INTERNAL_IN_JS); return firstToken; }
901 {JS_Identifier} { addToken(Token.IDENTIFIER); }
902 {Whitespace}+ { addToken(Token.WHITESPACE); }
903
904 /* String/Character literals. */
905 [\'] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
906 [\"] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
907
908 /* Comment literals. */
909 "/**/" { addToken(Token.COMMENT_MULTILINE); }
910 {JS_MLCBegin} { start = zzMarkedPos-2; yybegin(JS_MLC); }
911 {JS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
912
913 /* Attempt to identify regular expressions (not foolproof) - do after comments! */
914 {JS_Regex} {
915 boolean highlightedAsRegex = false;
916 if (firstToken==null) {
917 addToken(Token.REGEX);
918 highlightedAsRegex = true;
919 }
920 else {
921 // If this is *likely* to be a regex, based on
922 // the previous token, highlight it as such.
923 Token t = firstToken.getLastNonCommentNonWhitespaceToken();
924 if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
925 addToken(Token.REGEX);
926 highlightedAsRegex = true;
927 }
928 }
929 // If it doesn't *appear* to be a regex, highlight it as
930 // individual tokens.
931 if (!highlightedAsRegex) {
932 int temp = zzStartRead + 1;
933 addToken(zzStartRead, zzStartRead, Token.OPERATOR);
934 zzStartRead = zzCurrentPos = zzMarkedPos = temp;
935 }
936 }
937
938 /* Separators. */
939 {JS_Separator} { addToken(Token.SEPARATOR); }
940 {JS_Separator2} { addToken(Token.IDENTIFIER); }
941
942 {JspStart} { addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
943
944 /* Operators. */
945 {JS_Operator} { addToken(Token.OPERATOR); }
946
947 /* Numbers */
948 {JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
949 {JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
950 {JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
951 {JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
952
953 {JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
954
955 /* Ended with a line not in a string or comment. */
956 <<EOF>> { addEndToken(INTERNAL_IN_JS); return firstToken; }
957
958 /* Catch any other (unhandled) characters and flag them as bad. */
959 . { addToken(Token.ERROR_IDENTIFIER); }
960
961}
962
963
964<JS_STRING> {
965 [^\n\\\"]+ {}
966 \n { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
967 \\x{HexDigit}{2} {}
968 \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
969 \\u{HexDigit}{4} {}
970 \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
971 \\. { /* Skip all escaped chars. */ }
972 \\ { /* Line ending in '\' => continue to next line. */
973 if (validJSString) {
974 addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
975 addEndToken(INTERNAL_IN_JS_STRING_VALID);
976 }
977 else {
978 addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
979 addEndToken(INTERNAL_IN_JS_STRING_INVALID);
980 }
981 return firstToken;
982 }
983 \" { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
984 <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
985}
986
987<JS_CHAR> {
988 [^\n\\\']+ {}
989 \n { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
990 \\x{HexDigit}{2} {}
991 \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
992 \\u{HexDigit}{4} {}
993 \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
994 \\. { /* Skip all escaped chars. */ }
995 \\ { /* Line ending in '\' => continue to next line. */
996 if (validJSString) {
997 addToken(start,zzStartRead, Token.LITERAL_CHAR);
998 addEndToken(INTERNAL_IN_JS_CHAR_VALID);
999 }
1000 else {
1001 addToken(start,zzStartRead, Token.ERROR_CHAR);
1002 addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
1003 }
1004 return firstToken;
1005 }
1006 \' { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
1007 <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
1008}
1009
1010
1011<JS_MLC> {
1012 // JavaScript MLC's. This state is essentially Java's MLC state.
1013 [^hwf<\n\*]+ {}
1014 {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
1015 [hwf] {}
1016 {EndScriptTag} {
1017 yybegin(YYINITIAL);
1018 int temp = zzStartRead;
1019 addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
1020 addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
1021 addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
1022 addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
1023 }
1024 "<" {}
1025 \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
1026 {JS_MLCEnd} { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
1027 \* {}
1028 <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
1029}
1030
1031
1032<JS_EOL_COMMENT> {
1033 [^hwf<\n]+ {}
1034 {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
1035 [hwf] {}
1036 {EndScriptTag} {
1037 yybegin(YYINITIAL);
1038 int temp = zzStartRead;
1039 addToken(start,zzStartRead-1, Token.COMMENT_EOL);
1040 addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
1041 addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
1042 addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
1043 }
1044 "<" {}
1045 \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
1046 <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
1047
1048}
1049
1050
1051<JAVA_EXPRESSION> {
1052
1053 "%>" { addToken(Token.SEPARATOR); start = zzMarkedPos; yybegin(jspInState); }
1054
1055 /* Keywords */
1056 "abstract"|
1057 "assert" |
1058 "break" |
1059 "case" |
1060 "catch" |
1061 "class" |
1062 "const" |
1063 "continue" |
1064 "default" |
1065 "do" |
1066 "else" |
1067 "enum" |
1068 "extends" |
1069 "final" |
1070 "finally" |
1071 "for" |
1072 "goto" |
1073 "if" |
1074 "implements" |
1075 "import" |
1076 "instanceof" |
1077 "interface" |
1078 "native" |
1079 "new" |
1080 "null" |
1081 "package" |
1082 "private" |
1083 "protected" |
1084 "public" |
1085 "static" |
1086 "strictfp" |
1087 "super" |
1088 "switch" |
1089 "synchronized" |
1090 "this" |
1091 "throw" |
1092 "throws" |
1093 "transient" |
1094 "try" |
1095 "void" |
1096 "volatile" |
1097 "while" { addToken(Token.RESERVED_WORD); }
1098 "return" { addToken(Token.RESERVED_WORD_2); }
1099
1100 /* Data types. */
1101 {PrimitiveTypes} { addToken(Token.DATA_TYPE); }
1102
1103 /* Booleans. */
1104 {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
1105
1106 /* java.lang classes */
1107 "Appendable" |
1108 "AutoCloseable" |
1109 "CharSequence" |
1110 "Cloneable" |
1111 "Comparable" |
1112 "Iterable" |
1113 "Readable" |
1114 "Runnable" |
1115 "Thread.UncaughtExceptionHandler" |
1116 "Boolean" |
1117 "Byte" |
1118 "Character" |
1119 "Character.Subset" |
1120 "Character.UnicodeBlock" |
1121 "Class" |
1122 "ClassLoader" |
1123 "Compiler" |
1124 "Double" |
1125 "Enum" |
1126 "Float" |
1127 "InheritableThreadLocal" |
1128 "Integer" |
1129 "Long" |
1130 "Math" |
1131 "Number" |
1132 "Object" |
1133 "Package" |
1134 "Process" |
1135 "ProcessBuilder" |
1136 "ProcessBuilder.Redirect" |
1137 "Runtime" |
1138 "RuntimePermission" |
1139 "SecurityManager" |
1140 "Short" |
1141 "StackTraceElement" |
1142 "StrictMath" |
1143 "String" |
1144 "StringBuffer" |
1145 "StringBuilder" |
1146 "System" |
1147 "Thread" |
1148 "ThreadGroup" |
1149 "ThreadLocal" |
1150 "Throwable" |
1151 "Void" |
1152 "Character.UnicodeScript" |
1153 "ProcessBuilder.Redirect.Type" |
1154 "Thread.State" |
1155 "ArithmeticException" |
1156 "ArrayIndexOutOfBoundsException" |
1157 "ArrayStoreException" |
1158 "ClassCastException" |
1159 "ClassNotFoundException" |
1160 "CloneNotSupportedException" |
1161 "EnumConstantNotPresentException" |
1162 "Exception" |
1163 "IllegalAccessException" |
1164 "IllegalArgumentException" |
1165 "IllegalMonitorStateException" |
1166 "IllegalStateException" |
1167 "IllegalThreadStateException" |
1168 "IndexOutOfBoundsException" |
1169 "InstantiationException" |
1170 "InterruptedException" |
1171 "NegativeArraySizeException" |
1172 "NoSuchFieldException" |
1173 "NoSuchMethodException" |
1174 "NullPointerException" |
1175 "NumberFormatException" |
1176 "RuntimeException" |
1177 "SecurityException" |
1178 "StringIndexOutOfBoundsException" |
1179 "TypeNotPresentException" |
1180 "UnsupportedOperationException" |
1181 "AbstractMethodError" |
1182 "AssertionError" |
1183 "ClassCircularityError" |
1184 "ClassFormatError" |
1185 "Error" |
1186 "ExceptionInInitializerError" |
1187 "IllegalAccessError" |
1188 "IncompatibleClassChangeError" |
1189 "InstantiationError" |
1190 "InternalError" |
1191 "LinkageError" |
1192 "NoClassDefFoundError" |
1193 "NoSuchFieldError" |
1194 "NoSuchMethodError" |
1195 "OutOfMemoryError" |
1196 "StackOverflowError" |
1197 "ThreadDeath" |
1198 "UnknownError" |
1199 "UnsatisfiedLinkError" |
1200 "UnsupportedClassVersionError" |
1201 "VerifyError" |
1202 "VirtualMachineError" { addToken(Token.FUNCTION); }
1203
1204 {LineTerminator} { addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
1205
1206 {JIdentifier} { addToken(Token.IDENTIFIER); }
1207
1208 {WhiteSpace}+ { addToken(Token.WHITESPACE); }
1209
1210 /* String/Character literals. */
1211 {JCharLiteral} { addToken(Token.LITERAL_CHAR); }
1212 {JUnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
1213 {JErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
1214 {JStringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
1215 {JUnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
1216 {JErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
1217
1218 /* Comment literals. */
1219 "/**/" { addToken(Token.COMMENT_MULTILINE); }
1220 {MLCBegin} { start = zzMarkedPos-2; yybegin(JAVA_MLC); }
1221 {DocCommentBegin} { start = zzMarkedPos-3; yybegin(JAVA_DOCCOMMENT); }
1222 {LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
1223
1224 /* Annotations. */
1225 {Annotation} { addToken(Token.ANNOTATION); }
1226
1227 /* Separators. */
1228 {Separator} { addToken(Token.SEPARATOR); }
1229 {Separator2} { addToken(Token.IDENTIFIER); }
1230
1231 /* Operators. */
1232 {Operator} { addToken(Token.OPERATOR); }
1233
1234 /* Numbers */
1235 {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
1236 {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
1237 {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
1238 {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
1239
1240 {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
1241
1242 /* Ended with a line not in a string or comment. */
1243 <<EOF>> { addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
1244
1245 /* Catch any other (unhandled) characters and flag them as bad. */
1246 . { addToken(Token.ERROR_IDENTIFIER); }
1247
1248}
1249
1250
1251<JAVA_MLC> {
1252 [^hwf\n\*]+ {}
1253 {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
1254 [hwf] {}
1255 \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken; }
1256 {MLCEnd} { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
1257 \* {}
1258 <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken; }
1259}
1260
1261
1262<JAVA_DOCCOMMENT> {
1263
1264 [^hwf\@\{\n\<\*]+ {}
1265 {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
1266 [hwf] {}
1267
1268 "@"{BlockTag} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
1269 "@" {}
1270 "{@"{InlineTag}[^\}]*"}" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
1271 "{" {}
1272 \n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
1273 "<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
1274 \< {}
1275 {MLCEnd} { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
1276 \* {}
1277 <<EOF>> { yybegin(JAVA_EXPRESSION); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
1278
1279}
1280
1281
1282<JSP_DIRECTIVE> {
1283 "include" |
1284 "page" |
1285 "taglib" { addToken(Token.RESERVED_WORD); }
1286 "/" { addToken(Token.RESERVED_WORD); }
1287 {InTagIdentifier} { addToken(Token.IDENTIFIER); }
1288 {Whitespace}+ { addToken(Token.WHITESPACE); }
1289 "=" { addToken(Token.OPERATOR); }
1290 "%>" { yybegin(YYINITIAL); addToken(Token.SEPARATOR); }
1291 "%" { addToken(Token.IDENTIFIER); }
1292 ">" { addToken(Token.IDENTIFIER); /* Needed as InTagIdentifier ignores it. */ }
1293 {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
1294 {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
1295 {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); }
1296 {CharLiteral} { addToken(Token.LITERAL_CHAR); }
1297 <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_IN_JSP_DIRECTIVE); return firstToken; }
1298}
1299
Note: See TracBrowser for help on using the repository browser.