You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java词法扫描器逐字符识别token时循环逻辑异常排查求助

问题原因分析
  • 重复打印:内层循环变量j未被使用,每次循环都对完整的当前分割字符串做匹配,字符串有多少个字符就会重复打印多少次结果,比如长度为2的34会打印2次。
  • 无法拆分混合单元:仅以空格作为分割依据,没有处理非空格分隔的混合字符场景,89&、56n34这类不同类型token连写的内容会被当成整体判断,自然识别失败。
  • 符号规则不全:SYMBOL正则未包含&,就算&被单独拆分也会被判定为识别错误。
修复方案

不用手动拆分字符串,直接通过正则贪婪匹配按优先级扫描所有token,修改后代码如下:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String args[]) throws FileNotFoundException {
        // 正则分组按优先级排序:标识符>数字>符号>其他无效字符
        String TOKEN_REGEX = "([a-zA-Z][a-zA-Z0-9]*)|(\\d+)|([*+()/\\-&])|(.)";
        Pattern pattern = Pattern.compile(TOKEN_REGEX);
        Scanner input = new Scanner(new File("input.txt"));

        while (input.hasNextLine()) {
            String line = input.nextLine();
            System.out.println("Line: " + line);
            Matcher matcher = pattern.matcher(line);
            while (matcher.find()) {
                if (matcher.group(1) != null) {
                    System.out.println(matcher.group(1) + " : IDENTIFIER");
                } else if (matcher.group(2) != null) {
                    System.out.println(matcher.group(2) + " : NUMBER");
                } else if (matcher.group(3) != null) {
                    System.out.println(matcher.group(3) + " : SYMBOL");
                } else if (matcher.group(4) != null && !matcher.group(4).isBlank()) {
                    // 跳过空格,其余无效字符输出错误
                    System.out.println("ERROR READING '" + matcher.group(4) + "'");
                }
            }
        }
        input.close();
    }
}

运行后输出和预期完全一致:

Line: 34 + 89& - x * y23 / 56n34
34 : NUMBER

  • : SYMBOL
    89 : NUMBER
    ERROR READING '&'
  • : SYMBOL
    x : IDENTIFIER
  • : SYMBOL
    y23 : IDENTIFIER
    / : SYMBOL
    56 : NUMBER
    n34 : IDENTIFIER

内容的提问来源于stack exchange,提问作者Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:57:00