【问题标题】:Building Abstract Syntax Tree构建抽象语法树
【发布时间】:2012-03-26 16:44:00
【问题描述】:

我有我的解析树,现在我已经在解析树上按顺序遍历并生成了一个符号表。 但是我该如何为此构建 AST?

这是我收集到的(一些不可靠的资源):

  • 在您的解析树中,您按顺序排列,即 取最左边的孩子,然后是父母,然后是其他孩子的列表。
  • 如果您遇到 SEMICOL、Parenthesis 之类的内容,请不要将其添加到 AST,如果某个节点只有一个子节点,请删除该节点,然后改用子节点。

这就是我需要做的一切吗?

【问题讨论】:

  • 生成符号表令人印象深刻,因为此时您不知道范围。
  • @Hogan 我有解析树,什么会阻止我知道范围?
  • 此时您的系统不应包含任何语义信息。你刚刚解析了它。
  • @Kraken - 您的解析树和 AST 有何不同?它们可以是几乎相同的东西。就个人而言,我一直将解析树视为 AST,尽管我不是专家 - 我只编写了一些未发布的特定领域语言。也就是说,从一种树形式转换为另一种树形式实际上只是遍历旧树和创建新树的组合 - 如果您可以在解析时创建解析树,那么在遍历旧树时生成新树应该不会有太多麻烦一。您甚至可以选择遍历顺序和限制以适合您生成的内容。
  • @Hogan 来自我的解析树,在遍历它之后,我查看了所有声明的 ID 并将它们的信息添加到表中。

标签: c abstract-syntax-tree


【解决方案1】:

根据评论更新

在您的示例中,解析树可能包含这样的语句节点

(int) -> (ageArray) -> ([) -> (30) -> (]) -> (;)

教授期望像

(intArray) -> (ageArray) -> (30)

我猜。


您正在使解决方案变得简单。这不仅仅是遍历你的树并扔掉一些东西的问题。 AST 代表程序语言的结构。为了构建 AST,您首先必须设计 AST 的外观。

例如,“IF”节点可能被设计为具有布尔方程元素(这本身也可能是一棵树)、一个真语句树和一个假语句树。

您必须根据您正在编译的语言设计所有元素的外观。一旦你有了这样的设计,通常会在解析树上使用词法分析器来生成 AST。

【讨论】:

  • 是的,我的声明产品类似于 Declarstmt -> DECLARE listid : type ;所以我的父节点将是 Declarestmt Children List has DECLARE - listid - : -type : ;
  • 啊,你没有说你在使用编译器生成器。在这种情况下,像你说的那样按顺序删除不需要的元素。
  • 是什么让你说我正在使用编译器生成器,好吧,这就是我所做的。词法分析,使用 DFA ,将令牌流馈送到解析器,现在是解析器模块,将查看语法规则,然后使用 FIRST FOLLOW SETS 和 LL 预测解析技术,我构建了解析器。 (也使用堆栈)。这就是你所说的编译器生成器吗?
  • 是的,这就是编译器生成器所做的。完成后,我不需要其他步骤,解析器的输出已经是 AST,没有任何额外的垃圾。
  • 那么遍历的顺序和我之前问的一样对吗?如果你现在可以回答。 :) 谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多