private AbstractSet processTerminal()

in modules/regex/src/main/java/java/util/regex/Pattern.java [856:1054]


    private AbstractSet processTerminal(AbstractSet last) {
        int ch;
        AbstractSet term = null;
        do {
            ch = lexemes.peek();
            if ((ch & 0x8000ffff) == Lexer.CHAR_LEFT_PARENTHESIS) {
            	 int newFlags;             	
             	 lexemes.next();
                 newFlags = (ch & 0x00ff0000) >> 16;
                 ch = ch & 0xff00ffff;
                 if (ch == Lexer.CHAR_FLAGS) {
                     flags = newFlags;
                 } else {
                     newFlags = (ch == Lexer.CHAR_NONCAP_GROUP) 
                                 ? newFlags
                                 : flags;
                     term = processExpression(ch, newFlags, last);
                     if (lexemes.peek() != Lexer.CHAR_RIGHT_PARENTHESIS) {
                         throw new PatternSyntaxException(
                                 Messages.getString("regex.0A"), lexemes.toString(), //$NON-NLS-1$
                                 lexemes.getIndex());
                     }
                     lexemes.next();
                 }
            } else
                switch (ch) {
                case Lexer.CHAR_LEFT_SQUARE_BRACKET: {
                    lexemes.next();
                    boolean negative = false;
                    if (lexemes.peek() == Lexer.CHAR_CARET) {
                        negative = true;
                        lexemes.next();
                    }

                    term = processRange(negative, last);
                    if (lexemes.peek() != Lexer.CHAR_RIGHT_SQUARE_BRACKET)
                        throw new PatternSyntaxException(
                                Messages.getString("regex.0B"), lexemes.toString(), //$NON-NLS-1$
                                lexemes.getIndex());
                    lexemes.setMode(Lexer.MODE_PATTERN);
                    lexemes.next();
                    break;
                }

                case Lexer.CHAR_DOT: {
                    lexemes.next();

                    if (!hasFlag(Pattern.DOTALL)) {
                        term = new DotSet(AbstractLineTerminator
                                .getInstance(flags));
                    } else {
                        term = new DotAllSet();
                    }

                    break;
                }

                case Lexer.CHAR_CARET: {
                    lexemes.next();
                    consCount++;
                    if (!hasFlag(Pattern.MULTILINE)) {
                        term = new SOLSet();
                    } else {
                        term = new MultiLineSOLSet(AbstractLineTerminator
                                .getInstance(flags));
                    }

                    break;
                }

                case Lexer.CHAR_DOLLAR: {
                    lexemes.next();
                    consCount++;
                    if (!hasFlag(Pattern.MULTILINE)) {
                        if (!hasFlag(Pattern.UNIX_LINES)) {
                            term = new EOLSet(consCount);
                        } else {
                            term = new UEOLSet(consCount);
                        }
                    } else {
                        if (!hasFlag(Pattern.UNIX_LINES)) {
                            term = new MultiLineEOLSet(consCount);
                        } else {
                            term = new UMultiLineEOLSet(consCount);
                        }
                    }

                    break;
                }

                case Lexer.CHAR_WORD_BOUND: {
                    lexemes.next();
                    term = new WordBoundary(true);
                    break;
                }

                case Lexer.CHAR_NONWORD_BOUND: {
                    lexemes.next();
                    term = new WordBoundary(false);
                    break;
                }

                case Lexer.CHAR_END_OF_INPUT: {
                    lexemes.next();
                    term = new EOISet();
                    break;
                }

                case Lexer.CHAR_END_OF_LINE: {
                    lexemes.next();
                    term = new EOLSet(++consCount);
                    break;
                }

                case Lexer.CHAR_START_OF_INPUT: {
                    lexemes.next();
                    term = new SOLSet();
                    break;
                }

                case Lexer.CHAR_PREVIOUS_MATCH: {
                    lexemes.next();
                    term = new PreviousMatch();
                    break;
                }

                case 0x80000000 | '1':
                case 0x80000000 | '2':
                case 0x80000000 | '3':
                case 0x80000000 | '4':
                case 0x80000000 | '5':
                case 0x80000000 | '6':
                case 0x80000000 | '7':
                case 0x80000000 | '8':
                case 0x80000000 | '9': {
                    int number = (ch & 0x7FFFFFFF) - '0';
                    if (globalGroupIndex >= number) {
                        lexemes.next();
                        consCount++;
                        if (!hasFlag(Pattern.CASE_INSENSITIVE)) {
                            term = new BackReferenceSet(number, consCount);
                        } else if (!hasFlag(Pattern.UNICODE_CASE)) {
                            term = new CIBackReferenceSet(number, consCount);
                        } else {
                            term = new UCIBackReferenceSet(number, consCount);
                        }
                        (backRefs [number]).isBackReferenced = true;
                        needsBackRefReplacement = true;
                        break;
                    } else {
                        throw new PatternSyntaxException(
                                Messages.getString("regex.0C") //$NON-NLS-1$
                                        , lexemes.toString(), lexemes.getIndex());
                    }
                }

                case 0: {
                    AbstractCharClass cc = null;
                    if ((cc = (AbstractCharClass) lexemes.peekSpecial()) != null) {
                        term = processRangeSet(cc);
                    } else if (!lexemes.isEmpty()) {
                        
                        //ch == 0
                        term = new CharSet((char) ch);
                    } else {
                    	term = new EmptySet(last);
                        break;
                    }
                    lexemes.next();
                    break;
                }

                default: {
                    if (ch >= 0 && !lexemes.isSpecial()) {
                        term = processCharSet(ch);                        
                        lexemes.next();
                    } else if (ch == Lexer.CHAR_VERTICAL_BAR) {
                    	term = new EmptySet(last);
                    } else if (ch == Lexer.CHAR_RIGHT_PARENTHESIS) {
                        if (last instanceof FinalSet) {
                        	throw new PatternSyntaxException(
                    				Messages.getString("regex.09"), lexemes.toString(),  //$NON-NLS-1$
                    		    	lexemes.getIndex());
                        } else {
                    	    term = new EmptySet(last);
                        }
                    } else {
                        throw new PatternSyntaxException(
                                Messages.getString("regex.0D", //$NON-NLS-1$
                                 (lexemes.isSpecial() ? lexemes.peekSpecial()
                                        .toString() : Character
                                        .toString((char) ch))), lexemes
                                .toString(), lexemes.getIndex());
                    }
                }
                }
        } while (ch == Lexer.CHAR_FLAGS);
        return term;
    }