首页 > 解决方案 > Java takeWhile 状态

问题描述

我正在为一种编程语言编写解析器,并且我认为 Java 的 takeWhile 方法可能非常适合将词法标记分组到结构中。举个例子,要获得代表大括号分隔的代码块的标记流,我可以这样写:

stream.dropWhile(t -> !t.equals("{")).takeWhile(t -> !t.equals("}")))

…除了,如果有问题的块有嵌套块,例如函数声明,显然这不会起作用。在更命令式的风格中,我可能会在左大括号之后执行此操作:

assert(openCurlyToken.equals("{");
List blockTokens = new ArrayList<String>();
blockTokens.add(openCurlyToken);
String token;
int braceLevel = 1;
while (braceLevel > 0) {
  token = nextToken();
       if (token.equals("{")) braceLevel++;
  else if (token.equals("}")) braceLevel--;
  blockTokens.add(t);
}
return blockTokens;

有点丑,有点啰嗦。我希望有一种更简洁的方法来使用 Streams 进行这种计算?

标签: java

解决方案


推荐阅读