c++ - 在编译器中,C++ 窄解析

  显示原文与译文双语对照的内容
87 4

我正在为C++-like语言( 假设我们现在将编译 C++,而不要考虑 hack 。) 编写编译器。到目前为止,从流到lexer的阶段可以很窄;解析器调用可能调用getCharacter的。这与"宽宽"技术相对应,它将整个流加载到内存中,然后将流转换为令牌,然后进行解析。

现在我有一个简单的kdb和流,但是我想知道是否可以以创建一个窄的分析器。特别使用 re LL(1) 解析器。在任何情况下,最小的单元是从语义分析器到语义分析器( 函数语法树)的最小单元。整个文件单个语句树)?解析器将输出一个解析树。解析器输出的结果是否不同?

要使它的更清晰:分析器-> 解析器-> 语义分析

lexer将标记one-by-one发送给解析器,解析器解析它们。每当解析器请求令牌时,lexer都会提供它。现在我想对语义分析器进行同样的尝试。想象一下语义分析器:getTree() 使解析器得到足够的解析,以便为语义分析生成一个analyzable树。问题在于如何确定最小要求的树,以便成功地进行语义分析。

考虑一下:也许我要求一个重新入入的语义分析器。

时间:原作者:0个回答

68 5

在编译器( 词汇,AST node,符号表,符号表条目,控制流图形节点,生成的三元组) 中,如果把所有的数据类型都设置为期货,那么定义从编译器的每个阶段获取到下一个版本的信息。

如果你的语言是多线程的或者你可以伪造它,你甚至可以得到一些并行性。不清楚你可以能得到多少并行性,因为这些对象的大部分并不足以克服所有调度的开销。

( 我们这样做是为了一个Java解析器,把符号空间变成期货。这些是相当大的,所以同步成本得到了很好的分摊。当读取数千个Java源文件时,这会产生很大。

如果你没有获得很多并行性,那么可以能会因为开销而失去整体性能。通常,当你想要提高效率时,你需要进行批处理以避免在"下一步"中同步。

原作者:
...