alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.modules.web.core.syntax;

import org.netbeans.editor.Syntax;
import org.netbeans.editor.TokenID;

/**
* Lexical analyzer for the plain text.
*
* @author Petr Pisl
* @version 1.00
*/

public class ELSyntax extends Syntax {

    /* Internal states used internally by analyzer. There
    * can be any number of them declared by the analyzer.
    * They are usually numbered starting from zero but they don't
    * have to. The only reserved value is -1 which is reserved
    * for the INIT state - the initial internal state of the analyzer.
    */
    
    private static final int ISI_IDENTIFIER = 2;
    private static final int ISI_CHAR = 3; // inside char constant
    private static final int ISI_CHAR_A_BSLASH = 4; // inside char constant after backslash
    private static final int ISI_STRING = 5; // inside a string " ... "
    private static final int ISI_STRING_A_BSLASH = 6; // inside string "..." constant after backslash
    private static final int ISI_CHAR_STRING = 7;  // inside a string '...'
    private static final int ISI_CHAR_STRING_A_BSLASH = 8; // inside string '...'contant after backslash
    private static final int ISA_ZERO = 9; // after '0'
    private static final int ISI_INT = 10; // integer number
    private static final int ISI_OCTAL = 11; // octal number
    private static final int ISI_DOUBLE = 12; // double number
    private static final int ISI_DOUBLE_EXP = 13; // double number
    private static final int ISI_HEX = 14; // hex number
    private static final int ISA_DOT = 15; // after '.'
    private static final int ISI_WHITESPACE = 16; // inside white space
    private static final int ISA_EQ = 17; // after '='
    private static final int ISA_GT = 18; // after '>'
    private static final int ISA_LT = 19; // after '<'
    //private static final int ISA_PLUS = 20; // after '+'
    //private static final int ISA_MINUS = 21; // after '-'
    //private static final int ISA_STAR = 22; // after '*'
    private static final int ISA_PIPE = 23; // after '|'
    private static final int ISA_AND = 24; // after '&'
    private static final int ISA_EXCLAMATION = 25; // after '!'
    private static final int ISI_BRACKET = 26; // after '['
    private static final int ISI_BRACKET_A_WHITESPACE = 27;
    private static final int ISI_BRACKET_A_IDENTIFIER = 28;
    private static final int ISI_BRACKET_ISA_EQ = 29;
    private static final int ISI_BRACKET_ISA_GT = 30;
    private static final int ISI_BRACKET_ISA_LT =31;
    private static final int ISI_BRACKET_ISA_PIPE = 32; // after '|'
    private static final int ISI_BRACKET_ISA_AND = 33; // after '&'
    private static final int ISI_BRACKET_ISA_ZERO = 34; // after '0'
    private static final int ISI_BRACKET_ISA_DOT = 35; // after '.'
    private static final int ISI_BRACKET_ISI_INT = 36; // after '.'
    private static final int ISI_BRACKET_ISI_OCTAL = 37; // octal number
    private static final int ISI_BRACKET_ISI_DOUBLE = 38; // double number
    private static final int ISI_BRACKET_ISI_DOUBLE_EXP = 39; // double number
    private static final int ISI_BRACKET_ISI_HEX = 40; // hex number
    private static final int ISI_DOULE_EXP_ISA_SIGN = 41;
    private static final int ISI_BRACKET_ISI_DOULE_EXP_ISA_SIGN = 42;
    //private static final int ISA_PERCENT = 24; // after '%'
    

    public ELSyntax() {
        tokenContextPath = ELTokenContext.contextPath;
    }

    /** This is core function of analyzer and it returns one of following numbers:
    * a) token number of next token from scanned text
    * b) EOL when end of line was found in scanned buffer
    * c) EOT when there is no more chars available in scanned buffer.
    *
    * The function scans the active character and does one or more
    * of the following actions:
    * 1. change internal analyzer state (state = new-state)
    * 2. return token ID (return token-ID)
    * 3. adjust current position to signal different end of token;
    *    the character that offset points to is not included in the token
    */
    protected TokenID parseToken() {
	int len_isi_char = 0;
        // The main loop that reads characters one by one follows
        while (offset < stopOffset) {
            char ch = buffer[offset]; // get the current character
	    // - System.out.print(ch);
            switch (state) { // switch by the current internal state
            case INIT:
		// - System.out.print(" INIT (");
                switch (ch) {		    
		    case '"':
			// - System.out.print(" state->ISI_STRING ");
			state = ISI_STRING;
			break;
		    case '\'':
			// - System.out.print(" state->ISI_CHAR ");
			state = ISI_CHAR;
			len_isi_char = 0;
			break;
		    case '/':
			offset++;
			return ELTokenContext.DIV;
		    case '=':
			state = ISA_EQ;
			break;
		    case '>':
			state = ISA_GT;
			break;
		    case '<':
			state = ISA_LT;
			break;
		   case '+':
			offset++;
			return ELTokenContext.PLUS;
		    case '-':
			offset++;
			return ELTokenContext.MINUS;
		    case '*':
			offset++;
			return ELTokenContext.MUL;
		    case '|':
			state = ISA_PIPE;
			break;
		    case '&':
			state = ISA_AND;
			break;
		    case '[':
			//state = ISI_BRACKET;
			offset++;
			return ELTokenContext.LBRACKET;
			//break;
		    case ']':
			offset++;
			return ELTokenContext.RBRACKET;
		    case '%':
			offset++;
			return ELTokenContext.MOD;
		    case ':':
			//state = ISA_COLON;
			//break;
			offset++;
			return ELTokenContext.COLON;
		    case '!':
			state = ISA_EXCLAMATION;
			break;
		    case '(':
			offset++;
			return ELTokenContext.LPAREN;
		    case ')':
			offset++;
			return ELTokenContext.RPAREN;
	            case ',':
			offset++;
			return ELTokenContext.COMMA;
		    case '?':
			offset++;
			return ELTokenContext.QUESTION;
		    case '\n':
			offset++;
			// - System.out.print("r=EOL )");
			return ELTokenContext.EOL;
		    case '0':
			state = ISA_ZERO;
			break;
		    case '.':
			state = ISA_DOT;
			break;
		    default:
			// Check for whitespace
			if (Character.isWhitespace(ch)) {
			    state = ISI_WHITESPACE;
			    break;
			}
			
			// check whether it can be identifier
			if (Character.isJavaIdentifierStart(ch)){
			    // - System.out.print(" state->ISI_IDENTIFIER ");
			    state = ISI_IDENTIFIER;
			    break;
			}
			// Check for digit
			if (Character.isDigit(ch)) {
			    state = ISI_INT;
			    break;
			}
			// - System.out.print(" r=INVALID_CHAR )");
			offset++;
			return ELTokenContext.INVALID_CHAR;
			//break;
		    }
		// - System.out.print(")");
                break;
		
	    	
	    case ISI_WHITESPACE: // white space
                if (!Character.isWhitespace(ch)) {
                    state = INIT;
                    return ELTokenContext.WHITESPACE;
                }
                break;
		
	   case ISI_BRACKET:
		switch (ch){
		    case ']':
			state = INIT;
			//offset++;
			return ELTokenContext.IDENTIFIER;
		    case '"':
			offset++;
			return ELTokenContext.LBRACKET;
		    case '\'':
			offset++;
			return ELTokenContext.LBRACKET;
		    case '/':
			offset++;
			return ELTokenContext.DIV;
		    case '+':
			offset++;
			return ELTokenContext.PLUS;
		    case '-':
			offset++;
			return ELTokenContext.MINUS;
		    case '*':
			offset++;
			return ELTokenContext.MUL;
		    case '[':
			offset++;
			return ELTokenContext.LBRACKET;
		    case '%':
			offset++;
			return ELTokenContext.MOD;
		    case ':':
			offset++;
			return ELTokenContext.COLON;
		    case '(':
			offset++;
			return ELTokenContext.LPAREN;
		    case ')':
			offset++;
			return ELTokenContext.RPAREN;
		    case ',':
			offset++;
			return ELTokenContext.COMMA;	
		    case '?':
			offset++;
			return ELTokenContext.QUESTION;
		    case '=':
			state = ISI_BRACKET_ISA_EQ;
			break;
		    case '>':
			state = ISI_BRACKET_ISA_GT;
			break;
		    case '<':
			state = ISI_BRACKET_ISA_LT;
			break;
		    case '|':
			state = ISI_BRACKET_ISA_PIPE;
			break;
		    case '&':
			state = ISI_BRACKET_ISA_AND;
			break;
		    case '0':
			state = ISI_BRACKET_ISA_ZERO;
			break;
		    case '.':
			state = ISI_BRACKET_ISA_DOT;
			break;
		    default :
			// Check for whitespace
			if (Character.isWhitespace(ch)) {
			    state = ISI_BRACKET_A_WHITESPACE;
			    break;
			}
			if (Character.isJavaIdentifierStart(ch)){
			    // - System.out.print(" state->ISI_IDENTIFIER ");
			    state = ISI_BRACKET_A_IDENTIFIER;
			    break;
			}
			// Check for digit
			if (Character.isDigit(ch)) {
			    state = ISI_BRACKET_ISI_INT;
			    break;
			}
			// - System.out.print(" r=INVALID_CHAR )");
			offset++;
			return ELTokenContext.INVALID_CHAR;
			//break;
		}
		break;
		   
	    case ISI_BRACKET_A_WHITESPACE:
		if (!Character.isWhitespace(ch)) {
                    state = ISI_BRACKET;
                    return ELTokenContext.WHITESPACE;
                }
		break;
		
	    case ISI_BRACKET_ISA_EQ:
	    case ISA_EQ:
                switch (ch) {
                case '=':
                    offset++;
                    return  ELTokenContext.EQ_EQ;
                default:
		    state = (state == ISI_BRACKET_ISA_EQ) ? ISI_BRACKET : INIT;
		    offset--;
                    //return ELTokenContext.INVALID_CHAR;
                }
                break;
		
	    case ISI_BRACKET_ISA_GT:
	    case ISA_GT:
                switch (ch) {
                case '=':
                    offset++;
                    return ELTokenContext.GT_EQ;
                default:
                    state = (state == ISI_BRACKET_ISA_GT) ? ISI_BRACKET : INIT;
                    return ELTokenContext.GT;
                }
                //break;
	    case ISI_BRACKET_ISA_LT:	
            case ISA_LT:
                switch (ch) {
                case '=':
                    offset++;
                    return ELTokenContext.LT_EQ;
                default:
                    state = (state == ISI_BRACKET_ISA_LT) ? ISI_BRACKET : INIT;
                    return ELTokenContext.LT;
                }
                //break;
	    case ISI_BRACKET_ISA_PIPE:
	    case ISA_PIPE:
		switch (ch) {                
		case '|':
		    offset++;
		    state = INIT;
		    return ELTokenContext.OR_OR;
		default:
		    state = (state == ISI_BRACKET_ISA_PIPE) ? ISI_BRACKET : INIT;
		    offset--;
		}
		break;
	    case ISI_BRACKET_ISA_AND:	
	    case ISA_AND:
                switch (ch) {                
                case '&':
                    offset++;
                    state = INIT;
                    return ELTokenContext.AND_AND;
                default:
                    state = (state == ISI_BRACKET_ISA_AND) ? ISI_BRACKET : INIT;
                    offset--;
                }
                break;
	    case ISA_EXCLAMATION:
                switch (ch) {
                case '=':
                    offset++;
                    state = INIT;
                    return ELTokenContext.NOT_EQ;
                default:
                    state = INIT;
                    return ELTokenContext.NOT;
                }
	    case ISI_STRING:
		// - System.out.print(" ISI_STRING (");
		switch (ch) {
		    case '\\':
			// - System.out.print(" state->ISI_STRING_A_BSLASH");
			state = ISI_STRING_A_BSLASH;
			break;
		    case '\n':
			state = INIT;
			// - System.out.print(" state->INIT r=STRING_LITERAL )");
			return ELTokenContext.STRING_LITERAL;
		    case '"': // NOI18N
			offset++;
			state = INIT;
			// - System.out.print(" state->INIT r=STRING_LITERAL )");
			return ELTokenContext.STRING_LITERAL;
		    }
		// - System.out.print(")");
                break;
	    case ISI_STRING_A_BSLASH: 
		// - System.out.print(" ISI_STRING_A_BSLASH (");
		//switch (ch){
		//    case '"':
			state = ISI_STRING;
			// - System.out.print(" state->INIT ");
		// - System.out.print(")");
		break;	
	     case ISI_BRACKET_A_IDENTIFIER:
	     case ISI_IDENTIFIER:		 
		 // - System.out.print(" ISI_IDENTIFIER (");
		 if (!(Character.isJavaIdentifierPart(ch))){
		     switch (state){
			 case ISI_IDENTIFIER:
			    state = INIT; break;
			 case ISI_BRACKET_A_IDENTIFIER:
			    state = ISI_BRACKET;
			    break;
		     }
		     // - System.out.print(" state->INIT ");
		     
		     TokenID tid = matchKeyword(buffer, tokenOffset, offset - tokenOffset);
		     if (tid == null){
			 if (ch == ':'){
			     // - System.out.print(" r=TAG_LIB_PREFIX) ");
			    tid = ELTokenContext.TAG_LIB_PREFIX;
			 }
			 else{
			     tid = ELTokenContext.IDENTIFIER;
			     // - System.out.print(" r=IDENTIFIER)");
			 }
		     }
		     else {
			 // - System.out.println(" r=KEYWORDS )");
		     }		
		    return tid;
		 }
		// - System.out.print(")");
		break;
		
	    case ISI_CHAR:
		// - System.out.print(" ISI_CHAR (");
                switch (ch) {
                case '\\':
		    // - System.out.print(" state->ISI_CHAR_A_BSLASH )");
                    state = ISI_CHAR_A_BSLASH;
                    break;
		case '\n':
                    state = INIT;
		    // - System.out.print(" state->INIT r=CHAR_LITERAL )");
                    return ELTokenContext.CHAR_LITERAL;
                case '\'':
                    offset++;
                    state = INIT;
		    // - System.out.print(" state->INIT r=CHAR_LITERAL )");
                    return ELTokenContext.CHAR_LITERAL;
		default :
		    
		    if (buffer[offset-1] != '\'' && buffer[offset-1] != '\\'){
			// - System.out.print(" state->ISI_CHAR_STRING ");
			state = ISI_CHAR_STRING;
		    }
			
                }
		// - System.out.print(")");    
                break;

            case ISI_CHAR_A_BSLASH:
                switch (ch) {
                case '\'':
                case '\\':
                    break;
                default:
                    offset--;
                    break;
                }
                state = ISI_CHAR;
                break;
		
	     case ISI_CHAR_STRING:
		// - System.out.print(" ISI_CHAR_STRING (");
                switch (ch) {
                case '\\':
		    // - System.out.print(" state->ISI_CHAR_A_BSLASH )");
                    state = ISI_CHAR_STRING_A_BSLASH;
                    break;
		case '\n':
                    state = INIT;
		    // - System.out.print(" state->INIT r=STRING_LITERAL )");
                    return ELTokenContext.STRING_LITERAL;
                case '\'':
                    offset++;
                    state = INIT;
		    // - System.out.print(" state->INIT r=STRING_LITERAL )");
                    return ELTokenContext.STRING_LITERAL;
                }
		// - System.out.print(")");    
                break;
		
            case ISI_CHAR_STRING_A_BSLASH:
                switch (ch) {
                case '\'':
                case '\\':
                    break;
                default:
                    offset--;
                    break;
                }
                state = ISI_CHAR_STRING;
                break;
		
	    case ISI_BRACKET_ISA_ZERO:
	    case ISA_ZERO:
                switch (ch) {
                case '.':
		    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET_ISI_DOUBLE : ISI_DOUBLE;
                    break;
                case 'x':
                case 'X':
		    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET_ISI_HEX : ISI_HEX;
                    break;
                case 'l':
                case 'L':
                    offset++;
                    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET : INIT;
                    return ELTokenContext.LONG_LITERAL;
                case 'f':
                case 'F':
                    offset++;
                    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET : INIT;
                    return ELTokenContext.FLOAT_LITERAL;
                case 'd':
                case 'D':
                    offset++;
                    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET : INIT;
                    return ELTokenContext.DOUBLE_LITERAL;
                case '8': // it's error to have '8' and '9' in octal number
                case '9': 
                    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET : INIT;
                    offset++;
                    return ELTokenContext.INVALID_OCTAL_LITERAL;
                case 'e':
                case 'E':
		    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET_ISI_DOUBLE_EXP : ISI_DOUBLE_EXP;
                    break;
                default:
                    if (Character.isDigit(ch)) { // '8' and '9' already handled
			state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET_ISI_OCTAL : ISI_OCTAL;
                        break;
                    }
                    state = (state == ISI_BRACKET_ISA_ZERO) ? ISI_BRACKET : INIT;
                    return ELTokenContext.INT_LITERAL;
                }
                break;
		
	    case ISI_BRACKET_ISI_INT:
	    case ISI_INT:
                switch (ch) {
                case 'l':
                case 'L':
                    offset++;
                    state = (state == ISI_BRACKET_ISI_INT) ? ISI_BRACKET : INIT;
                    return ELTokenContext.LONG_LITERAL;
                case '.':
		    state = (state == ISI_BRACKET_ISI_INT) ? ISI_BRACKET_ISI_DOUBLE : ISI_DOUBLE;
                    break;
                case 'f':
                case 'F':
                    offset++;
                    state = (state == ISI_BRACKET_ISI_INT) ? ISI_BRACKET : INIT;
                    return ELTokenContext.FLOAT_LITERAL;
                case 'd':
                case 'D':
                    offset++;
                    state = (state == ISI_BRACKET_ISI_INT) ? ISI_BRACKET : INIT;
                    return ELTokenContext.DOUBLE_LITERAL;
                case 'e':
                case 'E':
                    state = ISI_DOUBLE_EXP;
                    break;
                default:
                    if (!(ch >= '0' && ch <= '9')) {
                        state = (state == ISI_BRACKET_ISI_INT) ? ISI_BRACKET : INIT;
                        return ELTokenContext.INT_LITERAL;
                    }
                }
                break;
		
	    case ISI_BRACKET_ISI_OCTAL:
            case ISI_OCTAL:
                if (!(ch >= '0' && ch <= '7')) {
                    state = (state == ISI_BRACKET_ISI_OCTAL) ? ISI_BRACKET : INIT;
                    return ELTokenContext.OCTAL_LITERAL;
                }
                break;
		
	    case ISI_BRACKET_ISI_DOUBLE:
            case ISI_DOUBLE:
                switch (ch) {
                case 'f':
                case 'F':
                    offset++;
                    state = (state == ISI_BRACKET_ISI_DOUBLE) ? ISI_BRACKET : INIT;
                    return ELTokenContext.FLOAT_LITERAL;
                case 'd':
                case 'D':
                    offset++;
                    state = (state == ISI_BRACKET_ISI_DOUBLE) ? ISI_BRACKET : INIT;
                    return ELTokenContext.DOUBLE_LITERAL;
                case 'e':
                case 'E':
		    state = (state == ISI_BRACKET_ISI_DOUBLE) ? ISI_BRACKET_ISI_DOUBLE_EXP : ISI_DOUBLE_EXP;
                    break;
                default:
                    if (!((ch >= '0' && ch <= '9')
                            || ch == '.')) {
                        state = (state == ISI_BRACKET_ISI_DOUBLE) ? ISI_BRACKET : INIT;
                        return ELTokenContext.DOUBLE_LITERAL;
                    }
                }
                break;
		
	    case ISI_DOUBLE_EXP:
            case ISI_BRACKET_ISI_DOUBLE_EXP:
                switch (ch) {
                case 'f':
                case 'F':
                    offset++;
                    state = (state == ISI_BRACKET_ISI_DOUBLE_EXP) ? ISI_BRACKET : INIT;
                    return ELTokenContext.FLOAT_LITERAL;
                case 'd':
                case 'D':
                    offset++;
                    state = (state == ISI_BRACKET_ISI_DOUBLE_EXP) ? ISI_BRACKET : INIT;
                    return ELTokenContext.DOUBLE_LITERAL;
		case '-':
		case '+':
		    state = ISI_DOULE_EXP_ISA_SIGN;
		    break;
                default:
                    if (!Character.isDigit(ch)){
                            //|| ch == '-' || ch == '+')) {
                        state = (state == ISI_BRACKET_ISI_DOUBLE_EXP) ? ISI_BRACKET : INIT;
                        return ELTokenContext.DOUBLE_LITERAL;
                    }
                }
                break;
		
	    case ISI_DOULE_EXP_ISA_SIGN:
	    case ISI_BRACKET_ISI_DOULE_EXP_ISA_SIGN:	
		if (!Character.isDigit(ch)){
		    state = (state == ISI_BRACKET_ISI_DOULE_EXP_ISA_SIGN) ? ISI_BRACKET : INIT;
		    return ELTokenContext.DOUBLE_LITERAL;
		}
		break;
		
	    case ISI_BRACKET_ISI_HEX:
            case ISI_HEX:
                if (!((ch >= 'a' && ch <= 'f')
                        || (ch >= 'A' && ch <= 'F')
                        || Character.isDigit(ch))
                   ) {
                    state = (state == ISI_BRACKET_ISI_HEX) ? ISI_BRACKET : INIT;
                    return ELTokenContext.HEX_LITERAL;
                }
                break;
	    
	    case ISI_BRACKET_ISA_DOT:
            case ISA_DOT:
                if (Character.isDigit(ch)) {
                    state = (state == ISI_BRACKET_ISA_DOT) ? ISI_BRACKET_ISI_DOUBLE : ISI_DOUBLE;

                } else { // only single dot
                    state = (state == ISI_BRACKET_ISA_DOT) ? ISI_BRACKET : INIT;
                    return ELTokenContext.DOT;
                }
                break;
		
            } // end of switch(state)

            offset++; // move to the next char
        }

        /* At this state there's no more text in the scanned buffer.
        * The caller will decide either to stop scanning at all
        * or to relocate scanning and provide next buffer with characters.
        * The lastBuffer variable indicates whether the scanning will
        * stop (true) or the caller will provide another buffer
        * to continue on (false) and call relocate() to continue on the given buffer.
        * If this is the last buffer, the analyzer must ensure
        * that for all internal states there will be some token ID returned.
        * The easiest way how to ensure that all the internal states will
        * be covered is to copy all the internal state constants and
        * put them after the switch() and provide the code that will return
        * appropriate token ID.
        *
        * When there are no more characters available in the buffer
        * and the buffer is not the last one the analyzer can still
        * decide to return the token ID even if it doesn't know whether
        * the token is complete or not. This is possible in this simple
        * implementation for example because it doesn't matter whether
        * it returns the text all together or broken into several pieces.
        * The advantage of such aproach is that the preScan value
        * is minimized which avoids the additional increasing of the buffer
        * by preScan characters, but on the other hand it can become
        * problematic if the token should be forwarded for some further
        * processing. For example it could seem handy to return incomplete
        * token for java block comments but it could become difficult
        * if we would want to analyzer these comment tokens additionally
        * by the HTML analyzer for example.
        */

        // Normally the following block would be done only for lastBuffer == true
        // but in this case it can always be done
	if (lastBuffer == true){	    
	    switch (state) {
		case ISI_WHITESPACE:
		    state = INIT;
		    return ELTokenContext.WHITESPACE;
		case ISI_IDENTIFIER:
		    state = INIT;
		    TokenID kwd = matchKeyword(buffer, tokenOffset, offset - tokenOffset);
		    return (kwd != null) ? kwd : ELTokenContext.IDENTIFIER;
		case ISI_STRING:
		case ISI_STRING_A_BSLASH:
		    return ELTokenContext.STRING_LITERAL; // hold the state
		case ISI_CHAR:
		case ISI_CHAR_A_BSLASH:
		    return ELTokenContext.CHAR_LITERAL;
		case ISI_CHAR_STRING :
		case ISI_CHAR_STRING_A_BSLASH :
		    return ELTokenContext.STRING_LITERAL;
		case ISA_ZERO:
		case ISI_INT:
		    state = INIT;
		    return ELTokenContext.INT_LITERAL;
		case ISI_OCTAL:
		    state = INIT;
		    return ELTokenContext.OCTAL_LITERAL;
		case ISI_DOUBLE:
		case ISI_DOUBLE_EXP:
		case ISI_DOULE_EXP_ISA_SIGN:
		case ISI_BRACKET_ISI_DOULE_EXP_ISA_SIGN:    
                    state = INIT;
	            return ELTokenContext.DOUBLE_LITERAL;
		case ISI_HEX:
		    state = INIT;
		    return ELTokenContext.HEX_LITERAL;
		case ISA_DOT:
		    state = INIT;
		    return ELTokenContext.DOT;
		case ISA_EQ:
		    state = INIT;
		    return ELTokenContext.EQ_EQ;
		case ISA_GT:
		    state = INIT;
		    return ELTokenContext.GT;
		case ISA_LT:
		    state = INIT;
		    return ELTokenContext.LT;
		case ISA_PIPE:
		    state = INIT;
		    return ELTokenContext.OR_OR;
		case ISA_AND:
		    state = INIT;
		    return ELTokenContext.AND_AND;
		case ISA_EXCLAMATION:
		    state = INIT;
		    return ELTokenContext.NOT;
		case ISI_BRACKET:		
		case ISI_BRACKET_A_IDENTIFIER:   
		    state = INIT;
		    return ELTokenContext.IDENTIFIER;
		case ISI_BRACKET_A_WHITESPACE:
		    state = ISI_BRACKET;
		    return ELTokenContext.WHITESPACE;
		case ISI_BRACKET_ISA_EQ:
		    state = ISI_BRACKET;
		    return ELTokenContext.EQ_EQ;
		case ISI_BRACKET_ISA_GT:
		    state = ISI_BRACKET;
		    return ELTokenContext.GT_EQ;
		case ISI_BRACKET_ISA_LT:
		    state = ISI_BRACKET;
		    return ELTokenContext.LT_EQ;
		case ISI_BRACKET_ISA_AND:
		    state = ISI_BRACKET;
		    return ELTokenContext.AND_AND;
		case ISI_BRACKET_ISA_PIPE:
		    state = ISI_BRACKET;
		    return ELTokenContext.OR_OR;
		case ISI_BRACKET_ISA_DOT:
		    state = ISI_BRACKET;
		    return ELTokenContext.DOT;
		case ISI_BRACKET_ISA_ZERO:    
		case ISI_BRACKET_ISI_INT:
		    state = ISI_BRACKET;
		    return ELTokenContext.INT_LITERAL;
		
		    
	    }
	}
	    
        return null;
    }
    
    
    public static TokenID matchKeyword(char[] buffer, int offset, int len) {	
        if (len > 10)
            return null;
        if (len <= 1)
            return null;
        switch (buffer[offset++]) {
            case 'a':
		if (len <= 2) return null;
		return (len == 3
                        && buffer[offset++] == 'n'
                        && buffer[offset++] == 'd')
                        ? ELTokenContext.AND_KEYWORD : null;
	    case 'd':
		if (len <= 2) return null;
		return (len == 3
                        && buffer[offset++] == 'i'
                        && buffer[offset++] == 'v')
                        ? ELTokenContext.DIV_KEYWORD : null;
	    case 'e':
		switch (buffer[offset++]) {
		    case 'q':
			return (len == 2) ? ELTokenContext.EQ_KEYWORD : null;
		    case 'm':
			return (len == 5
                        && buffer[offset++] == 'p'
			&& buffer[offset++] == 't'
                        && buffer[offset++] == 'y')
                        ? ELTokenContext.EMPTY_KEYWORD : null;
		    default:
			return null;
		}
	    case 'f':
		return (len == 5
		    && buffer[offset++] == 'a'
		    && buffer[offset++] == 'l'
		    && buffer[offset++] == 's'
		    && buffer[offset++] == 'e')
		    ? ELTokenContext.FALSE_KEYWORD : null;
	    case 'g':
		switch (buffer[offset++]){
		    case 'e':
			return (len == 2) ? ELTokenContext.GE_KEYWORD : null;
		    case 't':
			return (len == 2) ? ELTokenContext.GT_KEYWORD : null;
		    default:
			return null;
		}
	    case 'l':
		switch (buffer[offset++]){
		    case 'e':
			return (len == 2) ? ELTokenContext.LE_KEYWORD : null;
		    case 't':
			return (len == 2) ? ELTokenContext.LT_KEYWORD : null;
		    default:
			return null;
		}
	    case 'i':
		if (len <= 9) return null;
		return (len == 10
                        && buffer[offset++] == 'n'
			&& buffer[offset++] == 's'
			&& buffer[offset++] == 't'
			&& buffer[offset++] == 'a'
			&& buffer[offset++] == 'n'
			&& buffer[offset++] == 'c'
			&& buffer[offset++] == 'e'
			&& buffer[offset++] == 'o'
                        && buffer[offset++] == 'f')
                        ? ELTokenContext.INSTANCEOF_KEYWORD : null;
	    case 'm':
		if (len <= 2) return null;
		return (len == 3
                        && buffer[offset++] == 'o'
                        && buffer[offset++] == 'd')
                        ? ELTokenContext.MOD_KEYWORD : null;
	    case 'n':
		switch (buffer[offset++]){
		    case 'e':
			return (len == 2) ? ELTokenContext.NE_KEYWORD : null;
		    case 'o':
			return (len == 3
			    && buffer[offset++] == 't')
			    ? ELTokenContext.NOT_KEYWORD : null;
		    case 'u':
			return (len == 4
			    && buffer[offset++] == 'l'
			    && buffer[offset++] == 'l')
			    ? ELTokenContext.NULL_KEYWORD : null;
		    default:
			return null;
		}
	    case 'o':
		return (len == 2 
		    && buffer[offset++] == 'r')
		    ? ELTokenContext.OR_KEYWORD : null;
	    case 't':
		return (len == 4
		    && buffer[offset++] == 'r'
		    && buffer[offset++] == 'u'
		    && buffer[offset++] == 'e')
		    ? ELTokenContext.TRUE_KEYWORD : null;

	    default : 
		return null;
	}
    }
    
    public String getStateName(int stateNumber) {
	switch (stateNumber){
	    case ISI_IDENTIFIER		: return "jsp_el_ISI_IDENTIFIER";   //NOI18N
	    case ISI_CHAR		: return "el_ISI_CHAR";		    //NOI18N  
	    case ISI_CHAR_A_BSLASH	: return "el_ISI_CHAR_A_BSLASH";    //NOI18N
	    case ISI_STRING		: return "el_ISI_STRING";	    //NOI18N
	    case ISI_STRING_A_BSLASH	: return "el_ISI_STRING_A_BSLASH";  //NOI18N
	    case ISI_CHAR_STRING	: return "el_ISI_CHAR_STRING";	    //NOI18N
	    case ISI_CHAR_STRING_A_BSLASH : return "el_ISI_CHAR_STRING_A_BSLASH";//NOI18N
	    case ISA_ZERO		: return "el_ISA_ZERO";		    //NOI18N
	    case ISI_INT		: return "el_ISI_INT";		    //NOI18N
	    case ISI_OCTAL		: return "el_ISI_OCTAL";	    //NOI18N
	    case ISI_DOUBLE		: return "el_ISI_DOUBLE";	    //NOI18N
	    case ISI_DOUBLE_EXP		: return "el_ISI_DOUBLE_EXP";	    //NOI18N
	    case ISI_HEX		: return "el_ISI_HEX";		    //NOI18N
	    case ISA_DOT		: return "el_ISA_DOT";		    //NOI18N
	    case ISI_WHITESPACE		: return "el_ISI_WHITESPACE";	    //NOI18N
	    case ISA_EQ			: return "el_ISA_EQ";		    //NOI18N
	    case ISA_GT			: return "el_ISA_GT";		    //NOI18N
	    case ISA_LT			: return "el_ISA_LT";		    //NOI18N
	    case ISA_PIPE		: return "el_ISA_PIPE";		    //NOI18N
	    case ISA_AND		: return "el_ISA_AND";		    //NOI18N
	    case ISA_EXCLAMATION	: return "el_ISA_EXCLAMATION";	    //NOI18N
	    case ISI_BRACKET		: return "el_ISI_BRACKET";	    //NOI18N
	    case ISI_BRACKET_A_WHITESPACE: return "el_ISI_BRACKET_A_WHITSPACE";//NOI18N
	    case ISI_BRACKET_ISA_EQ	: return "el_ISI_BRACKET_ISA_EQ";   //NOI18N
	    case ISI_BRACKET_ISA_GT	: return "el_ISI_BRACKET_ISA_GT";   //NOI18N
	    case ISI_BRACKET_ISA_LT	: return "el_ISI_BRACKET_ISA_LT";   //NOI18N
	    case ISI_BRACKET_ISA_AND	: return "el_ISI_BRACKET_ISA_AND";  //NOI18N
	    case ISI_BRACKET_ISA_PIPE	: return "el_ISI_BRACKET_ISA_PIPE"; //NOI18N
	    case ISI_BRACKET_ISI_INT	: return "el_ISI_BRACKET_ISI_INT";  //NOI18N
	    case ISI_BRACKET_ISI_OCTAL	: return "el_ISI_BRACKET_ISI_OCTAL";	//NOI18N
	    case ISI_BRACKET_ISI_DOUBLE	: return "el_ISI_BRACKET_ISI_DOUBLE";	//NOI18N
	    case ISI_BRACKET_ISI_DOUBLE_EXP: return "el_ISI_BRACKET_ISI_DOUBLE_EXP";//NOI18N
	    case ISI_BRACKET_ISI_HEX	: return "el_ISI_BRACKET_ISI_HEX";  //NOI18N
	    case ISI_BRACKET_ISI_DOULE_EXP_ISA_SIGN : return "el_ISI_BRACKET_ISI_DOULE_EXP_ISA_SIGN";
	    case ISI_DOULE_EXP_ISA_SIGN : return "el_ISI_DOULE_EXP_ISA_SIGN";
	    default:
                return super.getStateName(stateNumber);
	}
    }
    
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.