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
相关产品推荐
相关产品推荐

