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