[Java lista] Pattern.compile bug (jdk 1.5) -- meglepo vegkifejlet

Andras Dobrosi andris at freemail.hu
2008. Már. 5., Sze, 11:02:46 CET


Hatha valaki kiszur vmit:

    /**
     * Processes repetition. If the next character peeked is a quantifier
     * then new nodes must be appended to handle the repetition.
     * Prev could be a single or a group, so it could be a chain of nodes.
     */
    private Node closure(Node prev) {
        Node atom;
        int ch = peek();
        switch (ch) {
        case '?':
            ch = next();
            if (ch == '?') {
                next();
                return new Ques(prev, LAZY);
            } else if (ch == '+') {
                next();
                return new Ques(prev, POSSESSIVE);
            }
            return new Ques(prev, GREEDY);
        case '*':
            ch = next();
            if (ch == '?') {
                next();
                return new Curly(prev, 0, MAX_REPS, LAZY);
            } else if (ch == '+') {
                next();
                return new Curly(prev, 0, MAX_REPS, POSSESSIVE);
            }
            return new Curly(prev, 0, MAX_REPS, GREEDY);
        case '+':
            ch = next();
            if (ch == '?') {
                next();
                return new Curly(prev, 1, MAX_REPS, LAZY);
            } else if (ch == '+') {
                next();
                return new Curly(prev, 1, MAX_REPS, POSSESSIVE);
            }
            return new Curly(prev, 1, MAX_REPS, GREEDY);
        case '{':
            ch = temp[cursor+1];
            if (ASCII.isDigit(ch)) {
                skip();
                int cmin = 0;
                do {
                    cmin = cmin * 10 + (ch - '0');
                } while (ASCII.isDigit(ch = read()));
                int cmax = cmin;
                if (ch == ',') {
                    ch = read();
                    cmax = MAX_REPS;
                    if (ch != '}') {
                        cmax = 0;
                        while (ASCII.isDigit(ch)) {
                            cmax = cmax * 10 + (ch - '0');
                            ch = read();
                        }
                    }
                }
                if (ch != '}')
                    throw error("Unclosed counted closure");
                if (((cmin) | (cmax) | (cmax - cmin)) < 0)
                    throw error("Illegal repetition range");
                Curly curly;
                ch = peek();
                if (ch == '?') {
                    next();
                    curly = new Curly(prev, cmin, cmax, LAZY);
                } else if (ch == '+') {
                    next();
                    curly = new Curly(prev, cmin, cmax, POSSESSIVE);
                } else {
                    curly = new Curly(prev, cmin, cmax, GREEDY);
                }
                return curly;
            } else {
                throw error("Illegal repetition");
            }
        default:
            return prev;
        }


Egyebkent pl. a case '{': agat pl. nem lehetett volna kicsit
elegansabban megoldani (nekem igy elso blikkre eleg tragyanak tunik,
biztos mar faradt volt a programozo, vagy haza akart erni a
baratokkoztre)?!

Andris

2008/3/5 Andras Dobrosi <andris at freemail.hu>:
> Hali!
>
>  Akkor cseréld a + is erre {1,} ! Szerintem se bug, de én sem nem tudom
>  miért lehet ez.
>
>  Andris
>
>  2008/3/5 Molnár Miklós <timortinj at freemail.hu>:
>
>
> > Hali,
>  >
>  >
>  >  >Asszem erre megis csak mondhatjuk, hogy bug :).
>  >
>  >  És biztosan nem lehet 'feature'? ;) /És a smiley ellenére azért komolyból is
>  >  kérdezem.../
>  >
>  >  MM
>  >
>  >  PS:
>  >  >Hat, ha arra panaszkodtam, hogy lassu, akkor te mire tippelsz? >;-)
>  >
>  >  Azért nem volt számomra egyértelmű, mert a threadből nekem speciel az jött
>  >  le, hogy vagy nagyon gyors, vagy nagyon lassú a regexpelési idő.
>  >  Amúgy pedig bocs mindenkitől, hogy nekem mint a viccbeli Mórickának
>  >  mindenről _az_ jut eszébe (lásd még 'bug vagy feature' problématikát), de én
>  >  nem tudok elszakadni attól, hogy például a teljesen más SQL-világban, nap,
>  >  mint nap találkozhatunk hasonlóan optimalizásra váró rejtélyes problémákkal,
>  >  a márcsak a dolog természeténél is fogva. Lehet, hogy nagyon elrugaszkodok a
>  >  talajról, de lehet, hogy mégsem olyan trivi a regexp-feldolgozás, mint
>  >  elsőre gondolhatnók.
>  >
>  >
>  >  __________ Information from ESET Smart Security, version of virus signature
>  >  database 2922 (20080305) __________
>  >
>  >  The message was checked by ESET Smart Security.
>  >
>  >  http://www.eset.com
>  >
>  >
>  >
>  >
>  >  _______________________________________________
>  >  Javalist mailing list
>  >  Javalist at javagrund.hu
>  >  http://javagrund.hu/mailman/listinfo/javalist
>  >
>


További információk a(z) Javalist levelezőlistáról