首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译器中的狭义解析

编译器中的狭义解析
EN

Stack Overflow用户
提问于 2015-05-20 14:02:34
回答 1查看 177关注 0票数 2

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

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

更清楚地说:词法分析器、->解析器、->语义分析

词法分析器将令牌逐个发送到解析器,解析器对其进行解析。每当解析器请求令牌时,lexer都会提供它。现在,我想对语义分析器进行同样的尝试。想象一下语义分析器: getTree()。它使解析器充分解析,从而生成用于语义分析的可分析树。问题是如何确定成功进行语义分析所需的最低要求树。

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

EN

回答 1

Stack Overflow用户

发布于 2015-05-20 14:40:13

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

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

(我们为Java解析器执行此操作,将符号空间转换为将来。这是相当大的,因此同步成本得到了很好的摊销。当读取几千个Java源文件时,这会产生很大的不同)。

如果你没有获得太多的并行性,那么你可能会因为开销而损失整体性能。通常,当你想要提高效率时,你会想要批量处理,以避免“获取下一件事”中的同步。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30341443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档