gpt4 book ai didi

c++ - 编译器中的窄解析

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:14 24 4
gpt4 key购买 nike

我正在为类似 C++ 的语言开发编译器(假设我们现在将编译 C++,并且不考虑 The Lexer Hack )。到目前为止,从流到词法分析器的阶段可能很窄;解析器调用 getToken,它可能调用 getCharacter。这与将整个流加载到内存中然后在移动到解析之前将流完全转换为标记的“广泛”技术形成对比。

现在我有了一个窄词法分析器和流,但我想知道是否也可以创建一个窄解析器。特别是使用可重入的 LL(1) 解析器。无论如何,从解析器进入语义分析器的最小单元是什么(函数语法树?整个文件?单个语句树?)?解析器将输出一个解析树。解析器应该输出不同的东西吗?

为了更清楚:Lexer -> 解析器 -> 语义分析

词法分析器将标记一个一个地发送给解析器,解析器解析它们。每当解析器请求 token 时,词法分析器都会提供它。现在我想对语义分析器进行同样的尝试。想象语义分析器运行:getTree()。它使解析器充分解析,从而生成可分析树以进行语义分析。问题是关于如何确定成功进行语义分析所需的最低限度树。

想想看:也许我要的是一个可重入的语义分析器。

最佳答案

如果您将编译器中的所有数据类型(词位、AST 节点、符号表、符号表条目、控制流图节点、生成的三元组)制作成futures ,根据定义,您将“尽早”从编译器的每个阶段获取信息到下一个阶段。

如果您的语言是多线程的或者您可以伪造它,您甚至可以获得一些并行性。不清楚您可能获得多少并行度,因为这些对象中的大多数都很小,并且花在每个对象上的计算可能不足以克服所有调度的开销。

(我们为 Java 解析器执行此操作,将符号空间变成 future 。它们非常大,因此同步成本得到很好的分摊。当读取数千个 Java 源文件时,这会产生很大的不同。

如果您没有获得太多并行性,那么您可能会因为开销而失去整体性能。通常,当您想要效率时,您希望将事情分批处理以避免在“获取下一件事”时同步。

关于c++ - 编译器中的窄解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30341443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com