请问老师 这里为什么用peek

来源:4-9 (编程lexer03 Java)——有穷状态机实现词语提取(下)

周鸣

2022-01-17

l老师 这里 lookahead 为什么用peek取 为啥不直接用next取 而是要在最后用next流掉

    public static Token makeNumber(PeekIterator<Character> it) throws LexicalException {

        String s = "";

        // 具体state的定义请查看状态机
        int state = 0;

        while(it.hasNext()) {
            char lookahead = it.peek();

            switch (state) {
                case 0:
                    if(lookahead == '0') {
                        state = 1;
                    } else if(AlphabetHelper.isNumber(lookahead)) {
                        state = 2;
                    } else if(lookahead == '+' || lookahead == '-') {
                        state = 3;
                    } else if (lookahead == '.') {
                        state = 5;
                    }
                    break;
                case 1:
                    if(lookahead == '0') {
                        state = 1;
                    }
                    else if (AlphabetHelper.isNumber(lookahead)) {
                        state = 2;
                    } else if (lookahead == '.') {
                        state = 4;
                    }
                    else {
                        return new Token(TokenType.INTEGER, s);
                    }
                    break;
                case 2:
                    if(AlphabetHelper.isNumber(lookahead)) {
                        state = 2;
                    }
                    else if(lookahead == '.') {
                        state = 4;
                    }
                    else {
                        return new Token(TokenType.INTEGER, s);
                    }
                    break;
                case 3:
                    if(AlphabetHelper.isNumber(lookahead)) {
                        state = 2;
                    } else if(lookahead == '.') {
                        state = 5;
                    } else {
                        throw new LexicalException(lookahead);
                    }
                    break;
                case 4:
                    if(lookahead == '.') {
                        throw new LexicalException(lookahead);
                    }
                    else if(AlphabetHelper.isNumber(lookahead)) {
                        state = 4;
                    }
                    else {
                        return new Token(TokenType.FLOAT, s);
                    }
                    break;
                case 5:
                    if(AlphabetHelper.isNumber(lookahead)) {
                        state = 4;
                    }
                    else {
                        throw new LexicalException(lookahead);
                    }
                    break;               

            }

            it.next();
            s += lookahead;
        }
        throw new LexicalException("Unexpected error");
    }
写回答

1回答

求老仙

2022-01-17

lookahead,就是向前看一个, 有lookahead但是不next的case,所以会这样。

0
2
Autonomy7269969
回复
周鸣
向前看就是你想的取当前值,因为指针都是在流存的值的前面。。。
2022-03-30
共2条回复

大学计算机必修课新讲--编译原理+操作系统+图形学

轻松超越大学课程,前阿里P8专家的实践精华总结

1752 学习 · 157 问题

查看课程