From 93a553ea93b7e161a39c5dafebd63d511588b5a0 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 16 Jul 2025 23:16:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=92=8C=E6=A0=87=E8=AF=86=E7=AC=A6=E5=8C=BA=E5=88=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 skipInvalidLexeme 方法,用于跳过无效的标识符和数字字符 - 修改错误处理逻辑,遇到词法错误时调用 skipInvalidLexeme 方法 --- .../snow/compiler/lexer/core/LexerEngine.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jcnc/snow/compiler/lexer/core/LexerEngine.java b/src/main/java/org/jcnc/snow/compiler/lexer/core/LexerEngine.java index 658182d..7272b77 100644 --- a/src/main/java/org/jcnc/snow/compiler/lexer/core/LexerEngine.java +++ b/src/main/java/org/jcnc/snow/compiler/lexer/core/LexerEngine.java @@ -87,7 +87,7 @@ public class LexerEngine { errors.add(new LexicalError( absPath, le.getLine(), le.getColumn(), le.getReason() )); - context.advance(); // 跳过问题字符 + skipInvalidLexeme(); } handled = true; break; @@ -97,6 +97,20 @@ public class LexerEngine { } tokens.add(Token.eof(context.getLine())); } + /** + * 跳过当前位置起连续的“标识符 / 数字 / 下划线 / 点”字符。 + *

这样可以把诸如 {@code 1abc} 的残余 {@code abc}、{@code _}、 + * {@code .999} 等一次性忽略,避免后续被误识别为新的 token。

+ */ + private void skipInvalidLexeme() { + while (!context.isAtEnd()) { + char c = context.peek(); + if (Character.isWhitespace(c)) break; // 空白 / 换行 + if (!Character.isLetterOrDigit(c) + && c != '_' && c != '.') break; // 符号分隔 + context.advance(); // 否则继续吞掉 + } + } /** * 目前包含三条规则: