Java takeWhile有状态

时间:2018-05-01 18:21:11

标签: java

我正在为编程语言编写解析器,我认为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进行这种计算?

0 个答案:

没有答案