请问老师 这里为什么用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,所以会这样。
022022-03-30
相似问题