加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

解析 – 共享迭代器

发布时间:2020-12-16 18:11:14 所属栏目:安全 来源:网络整理
导读:我正在 Scala中编写一个(简单的)编译器,并使tokenizer可迭代,现在需要编写解析器.计划是使用递归下降策略,因此解析器将被分成许多方法,每个方法调用(其中一些)其他方法. 我认为保持tokenizer迭代器的状态并在各种方法之间共享它是必要/可取的.是这样的吗?我
我正在 Scala中编写一个(简单的)编译器,并使tokenizer可迭代,现在需要编写解析器.计划是使用递归下降策略,因此解析器将被分成许多方法,每个方法调用(其中一些)其他方法.

我认为保持tokenizer迭代器的状态并在各种方法之间共享它是必要/可取的.是这样的吗?我该怎么办呢?如果不是这样,有哪些替代方案?

解决方法

如果必须维护迭代器的状态,请不要使用迭代器!迭代器是为了你可以随时摧毁你的状态.

您可以使用流来逃脱. Streams有一种不应该放弃记忆的习惯,因为在你不想要它们的地方坚持引用(但如果你想到它就可以告诉它们存在).因此,如果您开始使用迭代器,则可以.toStream它并传入子流,然后传递流以进行进一步处理.但是如果你想避免将所有内容保存在内存中,你必须非常小心不要保留对流的头部的引用.

另一种方法是将所有内容转储到向量或数组中,并将整个问题保存在内存中;然后,您可以在继续时删除不相关的部分(或推进索引).

最后,如果你绝对肯定你不需要任何回溯,那么你可以直接使用迭代器,而不必担心“维持状态”.也就是说,当你从子方法返回时,你已经完全消耗了正确的令牌而不再使用它,并且可以自由地继续解析.为了在返回值上没有至少一个单元素“我没有消耗的下一个标记”的情况下工作,你需要能够预测最后一个标记的位置(例如,无限长度列表必须以作为列表一部分的令牌,因此{1,2,3}可以是一个列表(如果你看到{并在你点击时退出}进入列表处理},但不是1,3 7(因为在你意识到列表结束之前你已经消费了)).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读