java - 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 进行这种计算?
解决方案
推荐阅读
- lisp - 似乎只有 lisp 允许使用变量而不先定义它?
- node.js - 如何使用 mongoose 在 mongoDb 中实现从 1 开始并递增的自定义对象 ID?
- adobe - scene7 url对齐属性
- c# - 将包含 JArray 的 JSON 对象反序列化为 C# 对象
- jquery - 如何在 Jquery Datatable 中将其他字段/列导出到 CSV/Excel?
- php - 题号递增的实现
- c# - WCF websocket 在断开连接时不会关闭
- react-native - 如何在 React Native 中使用 Amplify 将授权标头传递给 GraphQL
- php - 如何在 php 中发送 http 标头中的数据以调用另一个服务器 Api
- apache - Apache AH01328 Line too long 尝试下载损坏的文件时出错