protected TokenID parseToken()

in enterprise/web.core.syntax/src/org/netbeans/modules/web/core/syntax/deprecated/JspTagSyntax.java [95:759]


    protected TokenID parseToken() {
        char actChar;
        int _state; //help state

        while(offset < stopOffset) {
            actChar = buffer[offset];
            //System.out.println("JspTagSyntax: offset: " + offset + " actchar: '" + actChar
            //    + "' state: " + getStateName(state));
            switch (state) {
                case INIT:
                    switch (actChar) {
                        case '\n':
                            offset++;
                            return JspTagTokenContext.EOL;
                        case '<':
                            state = ISA_LT;
                            break;
                        default:
                            state = ISI_ERROR;
                            break;
                    }
                    break;

                case ISA_LT:
                    if (Character.isLetter(actChar) ||
                        (actChar == '_')
                    ) { // possible tag begining
                        state = ISI_TAG;
                        return JspTagTokenContext.SYMBOL;
                    }

                    switch (actChar) {
                        case '/':
                            state = ISA_LT_SLASH;
                            break;
                        case '\n':
                            state = ISI_TAG_ERROR;
                            return JspTagTokenContext.SYMBOL;
                        case '%':
                            state = ISA_LT_PC;
                            break;
                        default:
                            state = ISI_TAG_ERROR;
                            break;
                    }
                    break;
          
                case ISA_LT_SLASH:
                    if (Character.isLetter(actChar) ||
                        (actChar == '_')) {
                        //possible end tag beginning
                        //offset++;
                        state = ISI_ENDTAG;
                        return JspTagTokenContext.SYMBOL;
                    }
                    
                    //everyting alse is an error
                    state = ISI_TAG_ERROR;
                    break;
                    
                case ISI_TAG:
                case ISI_DIR:
                    if (!(Character.isLetter(actChar) ||
                          Character.isDigit(actChar) ||
                          (actChar == '_') ||
                          (actChar == '-') ||
                          (actChar == ':') || 
                          (actChar == '.'))
                    ) { // not alpha
                        if (actChar == '<'){
                            _state = state;
                            state = ISA_END_JSP;
                            return ((_state == ISI_TAG) ? JspTagTokenContext.TAG : JspDirectiveTokenContext.TAG);//TODO - parser
                        }
                        _state = state;
                        state = ((state == ISI_TAG) ? ISP_TAG : ISP_DIR);
                        return ((_state == ISI_TAG) ? JspTagTokenContext.TAG : JspDirectiveTokenContext.TAG); //TODO - parser
                    }
                    break;

                case ISP_TAG:
                case ISP_DIR:
                    if (Character.isLetter(actChar) ||
                        (actChar == '_')
                    ) {
                        state = ((state == ISP_TAG) ? ISI_TAG_ATTR : ISI_DIR_ATTR);
                        break;
                    }
                    switch (actChar) {
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return ((state == ISP_TAG) ? JspTagTokenContext.EOL : JspDirectiveTokenContext.EOL );//TODO - parser
                            } else { // return string first
                                return ((state == ISP_TAG) ? JspTagTokenContext.TAG : JspDirectiveTokenContext.TAG );//TODO - parser
                            }
                        case '>': // for tags
                            if (state == ISP_TAG) {
                                if (offset == tokenOffset) {  // no char
                                    offset++;
                                    state = ISA_END_JSP;
                                    return JspTagTokenContext.SYMBOL;
                                }
                                else { // return string first
                                    return JspTagTokenContext.TAG;
                                }
                            }  
                            else { // directive
                                //state = ISI_DIR_ERROR; 
                                //commented out to minimize errors during the process of writing directives
                                break;
                            }
                        case '/': // for tags
                            if (state == ISP_TAG) {
                                if (offset == tokenOffset) {  // no char
                                    state = ISA_ENDSLASH;
                                    break;
                                }
                                else { // return string first
                                    return JspTagTokenContext.TAG;
                                }
                            }  
                            else { // directive
                                //state = ISI_DIR_ERROR;
                                //commented out to minimize errors during the process of writing directives
                                break;
                            }
                        case '%': // for directives
                            if (state == ISP_DIR) {
                                if (offset == tokenOffset) {  // no char
                                    state = ISA_ENDPC;
                                    break;
                                }
                                else { // return string first
                                    return JspDirectiveTokenContext.TAG;
                                }
                            }  
                            else { // tag
                                state = ISI_TAG_ERROR;
                                break;
                            }
                        case '=':
                            offset++;
                            _state = state;
                            state = ((state == ISP_TAG) ? ISP_TAG_EQ : ISP_DIR_EQ);
                            return ((_state == ISP_TAG) ? JspTagTokenContext.SYMBOL : JspDirectiveTokenContext.SYMBOL);//TODO - parser
                        case ' ':
                        case '\t':
                            state = ((state == ISP_TAG) ? ISI_TAG_I_WS : ISI_DIR_I_WS);
                            break;
                        case '<': // assume that this is the start of the next tag
                            _state = state;
                            state=ISA_END_JSP;
                            return ((_state == ISP_TAG) ? JspTagTokenContext.TAG : JspDirectiveTokenContext.TAG );//TODO - parser
                        default: //numbers or illegal symbols
                            state = ((state == ISP_TAG) ? ISI_TAG_ERROR : ISI_DIR_ERROR);
                            break;
                    }
                    break;
          
                case ISI_TAG_I_WS:
                case ISI_DIR_I_WS:
                    switch (actChar) {
                        case ' ':
                        case '\t':
                            break;
                        case '<':
                            _state = state;
                            state = ISA_END_JSP;
                            return ((_state == ISI_TAG_I_WS) ? JspTagTokenContext.TAG : JspDirectiveTokenContext.TAG);//TODO - parser
                        default:
                            _state = state;
                            state = ((state == ISI_TAG_I_WS) ? ISP_TAG : ISP_DIR);
                            return ((_state == ISI_TAG_I_WS) ? JspTagTokenContext.WHITESPACE : JspDirectiveTokenContext.WHITESPACE );//TODO - parser
                    }
                    break;

                case ISI_ENDTAG:
                    if (!(Character.isLetter(actChar) ||
                          Character.isDigit(actChar) ||
                          (actChar == '_') ||
                          (actChar == '-') ||
                          (actChar == ':'))
                    ) { // not alpha
                        state = ISP_TAG;
                        return JspTagTokenContext.TAG;
                    }
                    break;

                case ISI_TAG_ATTR:
                case ISI_DIR_ATTR:
                    if (!(Character.isLetter(actChar) ||
                          Character.isDigit(actChar) ||
                          (actChar == '_') ||
                          (actChar == ':') ||
                          (actChar == '-'))
                    ) { // not alpha or '-' (http-equiv)
                        _state = state;
                        state = ((state == ISI_TAG_ATTR) ? ISP_TAG : ISP_DIR);
                        return ((_state == ISI_TAG_ATTR) ? JspTagTokenContext.ATTRIBUTE : JspDirectiveTokenContext.ATTRIBUTE);//TODO - parser
                    }
                    break;

                case ISP_TAG_EQ:
                case ISP_DIR_EQ:
                    switch (actChar) {
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return ((state == ISP_TAG_EQ) ? JspTagTokenContext.EOL : JspDirectiveTokenContext.EOL );//TODO - parser
                            } else { // return string first
                                return ((state == ISP_TAG_EQ) ? JspTagTokenContext.ATTR_VALUE : JspDirectiveTokenContext.ATTR_VALUE );//TODO - parser
                            }
                        case '"':
                            state = ((state == ISP_TAG_EQ) ? ISI_TAG_STRING : ISI_DIR_STRING);
                            break;
                        case '\'':
                            state = ((state == ISP_TAG_EQ) ? ISI_TAG_STRING2 : ISI_DIR_STRING2);
                            break;
                        case ' ':
                        case '\t':
                            // don't change the state
                            break;
                        default:
                            _state = state;
                            state = ((state == ISP_TAG_EQ) ? ISP_TAG : ISP_DIR);
                            return ((_state == ISP_TAG_EQ) ? JspTagTokenContext.ATTR_VALUE : JspDirectiveTokenContext.ATTR_VALUE );//TODO - parser                            
                    }
                    break;

                case ISI_TAG_STRING:
                case ISI_DIR_STRING:
                case ISI_TAG_STRING2:
                case ISI_DIR_STRING2:
                    if ((actChar == '"') && ((state == ISI_TAG_STRING) || (state == ISI_DIR_STRING))) {
                        offset++;
                        _state = state;
                        state = ((state == ISI_TAG_STRING) ? ISP_TAG : ISP_DIR);
                        return ((_state == ISI_TAG_STRING) ? JspTagTokenContext.ATTR_VALUE : JspDirectiveTokenContext.ATTR_VALUE );//TODO - parser
                    }
          
                    if ((actChar == '\'') && ((state == ISI_TAG_STRING2) || (state == ISI_DIR_STRING2))) {
                        offset++;
                        _state = state;
                        state = ((state == ISI_TAG_STRING2) ? ISP_TAG : ISP_DIR);
                        return ((_state == ISI_TAG_STRING2) ? JspTagTokenContext.ATTR_VALUE : JspDirectiveTokenContext.ATTR_VALUE );//TODO - parser
                    }

                    switch (actChar) {
                        case '\\':
                            switch (state) {
                                case ISI_TAG_STRING: 
                                    state = ISI_TAG_STRING_B;
                                    break;
                                case ISI_DIR_STRING: 
                                    state = ISI_DIR_STRING_B;
                                    break;
                                case ISI_TAG_STRING2: 
                                    state = ISI_TAG_STRING2_B;
                                    break;
                                case ISI_DIR_STRING2: 
                                    state = ISI_DIR_STRING2_B;
                                    break;
                            }
                            break;
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return (((state == ISI_TAG_STRING) || (state == ISI_TAG_STRING2)) ? JspTagTokenContext.EOL : JspDirectiveTokenContext.EOL );//TODO - parser
                                
                            } else { // return string first
                                return (((state == ISI_TAG_STRING) || (state == ISI_TAG_STRING2)) ? JspTagTokenContext.ATTR_VALUE : JspDirectiveTokenContext.ATTR_VALUE );//TODO - parser                                
                            }
                    }
                    break;

                case ISI_TAG_STRING_B:
                case ISI_DIR_STRING_B:
                case ISI_TAG_STRING2_B:
                case ISI_DIR_STRING2_B:
                    switch (actChar) {
                        case '"':
                        case '\'':
                        case '\\':
                            break;
                        default:
                            offset--;
                            break;
                    }
                    switch (state) {
                        case ISI_TAG_STRING_B: 
                            state = ISI_TAG_STRING;
                            break;
                        case ISI_DIR_STRING_B: 
                            state = ISI_DIR_STRING;
                            break;
                        case ISI_TAG_STRING2_B: 
                            state = ISI_TAG_STRING2;
                            break;
                        case ISI_DIR_STRING2_B:
                            state = ISI_DIR_STRING2;
                            break;
                    }    
                    break;

                case ISA_ENDSLASH:
                    switch (actChar) {
                        case '>':
                            offset++;
                            state = ISA_END_JSP;
                            return JspTagTokenContext.SYMBOL;
                        case '\n':
                            state = ISI_TAG_ERROR;
                            return JspTagTokenContext.SYMBOL;
                        default:
                            state = ISP_TAG;
                            return JspTagTokenContext.SYMBOL;
                    }
                    //break; not reached
          
                case ISA_ENDPC:
                    switch (actChar) {
                        case '>':
                            offset++;
                            state = ISA_END_JSP;
                            return JspDirectiveTokenContext.SYMBOL;
                        case '\n':
                            state = ISI_DIR_ERROR;
                            return JspDirectiveTokenContext.SYMBOL;
                        default:
                            state = ISP_DIR;
                            return JspDirectiveTokenContext.SYMBOL;
                    }
                    //break; not reached
          
                case ISA_LT_PC:
                    switch (actChar) {
                        case '@':
                            offset++;
                            state = ISA_LT_PC_AT;
                            return JspDirectiveTokenContext.SYMBOL;
                        case '-':
                            state = ISA_LT_PC_DASH;
                            break;
                        default: // just cut it, because this will be recognized 
                                          // by master syntax as a Java scriptlet/expression/declaration
                            state = ISA_END_JSP;
                            return JspTagTokenContext.SYMBOL;
                    }
                    break;
          
                case ISA_LT_PC_DASH:
                    switch(actChar) {
                        case '-':
                            state = ISI_JSP_COMMENT;
                            break;
                        default:
                            offset++;
                            state = ISA_END_JSP;
                            return JspDirectiveTokenContext.TEXT;
                    }
                    break;
                    
                // JSP states                
                case ISI_JSP_COMMENT:
                    switch (actChar) {
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return JspTagTokenContext.EOL;
                            } else { // return block comment first
                                return JspTagTokenContext.COMMENT;
                            }
                        case '-':  
                            state = ISI_JSP_COMMENT_M;
                            break;
                    }
                    break;
          
                case ISI_JSP_COMMENT_M:
                    switch (actChar) {
                        case '\n':
                            state = ISI_JSP_COMMENT;
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return JspTagTokenContext.EOL;
                            } else { // return block comment first
                                return JspTagTokenContext.COMMENT;
                            }
                        case '-':
                            state = ISI_JSP_COMMENT_MM;
                            break;
                        default:
                            state = ISI_JSP_COMMENT;
                            break;
                    }
                    break;
          
                case ISI_JSP_COMMENT_MM:
                    switch (actChar) {
                        case '\n':
                            state = ISI_JSP_COMMENT;
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return JspTagTokenContext.EOL;
                            } else { // return block comment first
                                return JspTagTokenContext.COMMENT;
                            }
                        case '%':
                            state = ISI_JSP_COMMENT_MMP;
                            break;
                        case '-':
                            state = ISI_JSP_COMMENT_MM;
                            break;
                        default:
                            state = ISI_JSP_COMMENT;
                            break;
                    }
                    break;
          
                case ISI_JSP_COMMENT_MMP:
                    switch (actChar) {
                        case '\n':
                            state = ISI_JSP_COMMENT;
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return JspTagTokenContext.EOL;
                            } else { // return block comment first
                                return JspTagTokenContext.COMMENT;
                            }
                        case '>':
                            state = ISA_END_JSP;
                            offset++;
                            return JspTagTokenContext.COMMENT;
                        default:
                            state = ISI_JSP_COMMENT;
                            break;
                    }
                    break;
          
                case ISI_ERROR:
                    switch (actChar) {
                        case '\n':
                            state = INIT;
                            return JspTagTokenContext.ERROR;
                        case '<':
                            state = ISA_LT;
                            return JspTagTokenContext.ERROR;
                    }
                    break;
          
                case ISI_TAG_ERROR:
                    switch (actChar) {
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                state = ISI_TAG_I_WS;
                                return JspTagTokenContext.EOL;
                            } else { // return error first
                                return JspTagTokenContext.ERROR;
                            }
                        case '>':
                            state = ISI_TAG_I_WS;
                            return JspTagTokenContext.ERROR;
                        case ' ':
                        case '\t':
                            state = ISI_TAG;
                            return JspTagTokenContext.ERROR;
                            
                    }
                    break;
          
                case ISI_DIR_ERROR:
                    switch (actChar) {
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                state = ISI_DIR_I_WS;
                                return JspDirectiveTokenContext.EOL;
                            } else { // return error first
                                return JspDirectiveTokenContext.ERROR;
                            }
                        case '%':
                            state = ISI_TAG;
                            return JspDirectiveTokenContext.ERROR;    
                        case '\t':    
                        case ' ':
                            state = ISI_DIR_I_WS;
                            return JspDirectiveTokenContext.ERROR;                        
                    }
                    break;
          
                case ISI_DIR_ERROR_P:
                    switch (actChar) {
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                state = ISI_DIR_I_WS;
                                return JspDirectiveTokenContext.EOL;
                            } else { // return error first
                                return JspDirectiveTokenContext.ERROR;
                            }
                        case '>':
                            offset--;
                            state = ISI_DIR_I_WS;
                            return JspDirectiveTokenContext.ERROR;
                    }
                    break;
          
                case ISA_END_JSP:
                    if (offset == tokenOffset) {
                        offset++;
                        return JspTagTokenContext.AFTER_UNEXPECTED_LT;
                    }
                    else {
                        return JspTagTokenContext.TEXT;
                    }
                    //break;
                    
                // added states
                case ISA_LT_PC_AT:  
                    if (Character.isLetter(actChar) ||
                        (actChar == '_')
                    ) { // the directive starts
                        state = ISI_DIR;
                        return JspDirectiveTokenContext.TAG;
                    }

                    switch (actChar) {
                        case '\n':
                            if (offset == tokenOffset) { // no char
                                offset++;
                                return JspDirectiveTokenContext.EOL;
                            }
                            else {
                                return JspDirectiveTokenContext.TAG;
                            }
                    }
                    break;
          
            }
      
            ++offset;
        } // end of while(offset...)

        // At this stage there's no more text in the scanned buffer.
        // Scanner first checks whether this is completely the last
        // available buffer.

        if (lastBuffer) {
            switch(state) {
                case ISI_ERROR:
                case ISI_TAG_ERROR:  
                    return JspTagTokenContext.ERROR;
                case ISI_DIR_ERROR:  
                case ISI_DIR_ERROR_P:  
                    return JspDirectiveTokenContext.ERROR;
                case ISA_LT:
                case ISA_LT_SLASH:
                case ISA_ENDSLASH:
                case ISP_TAG_EQ:
                    return JspTagTokenContext.SYMBOL;
                case ISA_LT_PC:
                case ISA_LT_PC_DASH:
                case ISA_ENDPC:
                case ISP_DIR_EQ:
                    return JspDirectiveTokenContext.SYMBOL;
                case ISI_TAG:
                case ISI_ENDTAG:
                    return JspTagTokenContext.TAG;
                case ISI_DIR:
                    return JspDirectiveTokenContext.TAG;
                case ISP_TAG:
                case ISI_TAG_I_WS:
                    return JspTagTokenContext.TAG;
                case ISP_DIR:
                case ISI_DIR_I_WS:
                case ISA_LT_PC_AT:
                    return JspDirectiveTokenContext.TAG;
                case ISI_TAG_ATTR:
                    return JspTagTokenContext.ATTRIBUTE;
                case ISI_DIR_ATTR:
                    return JspDirectiveTokenContext.ATTRIBUTE;
                case ISI_TAG_STRING:
                case ISI_TAG_STRING_B:
                case ISI_TAG_STRING2:    
                case ISI_TAG_STRING2_B:
                    return JspTagTokenContext.ATTR_VALUE;
                case ISI_DIR_STRING:
                case ISI_DIR_STRING_B:
                case ISI_DIR_STRING2:
                case ISI_DIR_STRING2_B:
                    return JspDirectiveTokenContext.ATTR_VALUE;
                case ISI_JSP_COMMENT:
                case ISI_JSP_COMMENT_M:
                case ISI_JSP_COMMENT_MM:
                case ISI_JSP_COMMENT_MMP:
                    return JspTagTokenContext.COMMENT;
                case ISA_END_JSP:
                    return JspTagTokenContext.TEXT;
                default:
                    Logger.getLogger("global").log(Level.INFO, null, new Exception("Unhandled state : " + getStateName(state)));
            }
        }

        // At this stage there's no more text in the scanned buffer, but
        // this buffer is not the last so the scan will continue on another buffer.
        // The scanner tries to minimize the amount of characters
        // that will be prescanned in the next buffer.

        // pending
        
        //Following code has been commented out because it may produce incomplete tokens
        //when the parse buffer end falls somewhere inside a token. In such a case 
        //an incomplete token is created - the token ends at the offset of the parse buffer.
        //Although this approach may save some machine time due to syntax prescan minimalization,
        //it can and in fact does cause problems in a code which relies on tokens 
        //to be compact (e.g. code completion - see issue #47165).
        /*switch(state) {
            case ISI_ERROR:
            case ISI_TAG_ERROR:  
            case ISI_DIR_ERROR:  
            case ISI_DIR_ERROR_P:  
                return JspTagTokenContext.ERROR;
            case ISA_LT:
            case ISA_LT_PC:
            // case ISA_ENDSLASH:   // it is important to keep '/>' token complete
            case ISA_ENDPC:
            case ISP_TAG_EQ:
            case ISP_DIR_EQ:
                return JspTagTokenContext.SYMBOL;
            case ISI_TAG:
            case ISI_DIR:
            case ISI_ENDTAG:
                return JspTagTokenContext.TAG;
            case ISP_TAG:
            case ISP_DIR:
            case ISI_TAG_I_WS:
            case ISI_DIR_I_WS:
            case ISA_LT_PC_AT:
                return JspTagTokenContext.TAG;
            case ISI_TAG_ATTR:
            case ISI_DIR_ATTR:
                return JspTagTokenContext.ATTRIBUTE;
            case ISI_TAG_STRING:
            case ISI_DIR_STRING:
            case ISI_TAG_STRING_B:
            case ISI_DIR_STRING_B:
            case ISI_TAG_STRING2:
            case ISI_DIR_STRING2:
            case ISI_TAG_STRING2_B:
            case ISI_DIR_STRING2_B:
                return JspTagTokenContext.ATTR_VALUE;
            case ISI_JSP_COMMENT:
            case ISI_JSP_COMMENT_M:
            case ISI_JSP_COMMENT_MM:
            case ISI_JSP_COMMENT_MMP:
                return JspTagTokenContext.COMMENT;
            case ISA_END_JSP:
                return JspTagTokenContext.TEXT;
        }
*/
        return null;

    }