feat: StringTokenScanner 重构为状态机
This commit is contained in:
parent
367ae8653e
commit
bb4c4f6ce4
@ -29,7 +29,7 @@ public class StringTokenScanner extends AbstractTokenScanner {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean canHandle(char c, LexerContext ctx) {
|
public boolean canHandle(char c, LexerContext ctx) {
|
||||||
return c == '"';
|
return c == '"'; // 只处理字符串开始符号
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,19 +45,51 @@ public class StringTokenScanner extends AbstractTokenScanner {
|
|||||||
@Override
|
@Override
|
||||||
protected Token scanToken(LexerContext ctx, int line, int col) {
|
protected Token scanToken(LexerContext ctx, int line, int col) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append(ctx.advance()); // 起始双引号
|
// 当前状态
|
||||||
|
State currentState = State.START; // 初始状态为开始扫描字符串
|
||||||
|
|
||||||
|
// 开始扫描字符串
|
||||||
while (!ctx.isAtEnd()) {
|
while (!ctx.isAtEnd()) {
|
||||||
char c = ctx.advance();
|
char c = ctx.advance();
|
||||||
sb.append(c);
|
sb.append(c);
|
||||||
|
|
||||||
if (c == '\\') {
|
switch (currentState) {
|
||||||
sb.append(ctx.advance()); // 添加转义字符后的实际字符
|
case START:
|
||||||
} else if (c == '"') {
|
// 开始状态,遇到第一个双引号
|
||||||
break;
|
currentState = State.STRING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRING:
|
||||||
|
if (c == '\\') {
|
||||||
|
// 遇到转义字符,进入 ESCAPE 状态
|
||||||
|
currentState = State.ESCAPE;
|
||||||
|
} else if (c == '"') {
|
||||||
|
// 遇到结束的双引号,结束扫描
|
||||||
|
currentState = State.END;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ESCAPE:
|
||||||
|
// 在转义状态下,处理转义字符
|
||||||
|
sb.append(ctx.advance()); // 加入转义字符后的字符
|
||||||
|
currentState = State.STRING; // 返回字符串状态
|
||||||
|
break;
|
||||||
|
|
||||||
|
case END:
|
||||||
|
// 结束状态,字符串扫描完成
|
||||||
|
return new Token(TokenType.STRING_LITERAL, sb.toString(), line, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果没有结束的双引号,则表示错误,或者未正确处理
|
||||||
return new Token(TokenType.STRING_LITERAL, sb.toString(), line, col);
|
return new Token(TokenType.STRING_LITERAL, sb.toString(), line, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 定义状态枚举
|
||||||
|
private enum State {
|
||||||
|
START, // 开始状态,寻找字符串的开始双引号
|
||||||
|
STRING, // 字符串扫描状态,处理字符串中的字符
|
||||||
|
ESCAPE, // 处理转义字符状态
|
||||||
|
END // 字符串结束状态
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user