From dbc3ea0a33dd6aecca66d2d8083b516f366d1452 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 1 Jul 2025 17:10:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20NewlineTokenScanner=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E4=B8=BA=E7=8A=B6=E6=80=81=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lexer/scanners/NewlineTokenScanner.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/lexer/scanners/NewlineTokenScanner.java b/src/main/java/org/jcnc/snow/compiler/lexer/scanners/NewlineTokenScanner.java index daea57c..0f63e70 100644 --- a/src/main/java/org/jcnc/snow/compiler/lexer/scanners/NewlineTokenScanner.java +++ b/src/main/java/org/jcnc/snow/compiler/lexer/scanners/NewlineTokenScanner.java @@ -7,10 +7,19 @@ import org.jcnc.snow.compiler.lexer.token.TokenType; /** * 换行符扫描器:将源代码中的换行符(\n)识别为 {@code NEWLINE} 类型的 Token。 *

- * 通常用于记录行的分界,辅助语法分析阶段进行行敏感的判断或保持结构清晰。 + * 用于记录行的分界,辅助语法分析阶段进行行敏感的判断或保持结构清晰。 */ public class NewlineTokenScanner extends AbstractTokenScanner { + // 定义状态枚举 + private enum State { + INITIAL, + NEWLINE + } + + // 当前状态 + private State currentState = State.INITIAL; + /** * 判断是否可以处理当前位置的字符。 *

当字符为换行符(\n)时返回 true。

@@ -21,7 +30,8 @@ public class NewlineTokenScanner extends AbstractTokenScanner { */ @Override public boolean canHandle(char c, LexerContext ctx) { - return c == '\n'; + // 只有当处于 INITIAL 状态,并且遇到换行符时,才可以处理 + return currentState == State.INITIAL && c == '\n'; } /** @@ -35,7 +45,16 @@ public class NewlineTokenScanner extends AbstractTokenScanner { */ @Override protected Token scanToken(LexerContext ctx, int line, int col) { + // 状态转换为 NEWLINE + currentState = State.NEWLINE; + + // 执行换行符扫描,生成 token ctx.advance(); - return new Token(TokenType.NEWLINE, "\n", line, col); + Token newlineToken = new Token(TokenType.NEWLINE, "\n", line, col); + + // 扫描完成后,恢复状态为 INITIAL + currentState = State.INITIAL; + + return newlineToken; } -} \ No newline at end of file +}