如何为*(b + c)* d创建抽象语法树

时间:2014-11-14 13:18:53

标签: syntax compiler-construction tree abstract abstract-syntax-tree

我对如何表示AST中的括号感到困惑。我知道怎么做一个解析树,朋友告诉我AST不会包含括号,我无法从任何文本中验证

2 个答案:

答案 0 :(得分:2)

你的朋友是对的,抽象语法树不包含括号。括号只控制树的结构,它们本身不会出现在树中。

因此,a*(b+c)会创建一个树,其中a*的左子项,而右子项是另一个子树,其中bc+的孩子。 a*b+c(a*b)+c两者都会创建一个树为+的树,*为子ab为左子+c+的正确孩子。

  

我无法从任何文本验证

来自抽象语法树上的Wikipedia article

  

语法是“抽象的”,不代表真实语法中出现的每个细节。例如,分组括号隐含在树结构中

答案 1 :(得分:1)

AST的标准智慧是它们不包含表达式中的括号。 这实际上只是一个品味问题。你可以这样做。

抽象点是某些细节被删除。

有人可能决定放弃除括号之外的其他细节;你仍然得到一个抽象的语法树。例如,如果你采用完全具体的语法树,并删除所有具有固定拼写的终端节点(包括'+','IF'和'(')),你会得到一个很好的抽象语法树。

我构建了一个程序分析和转换工具,可以从原始语法中自动完成这种抽象(和其他几个)。它有一些非常好的好处:

  • 从语法构建解析器时,您可以自动构造AST而无需手动编写任何代码。在构建和维护像C ++ 14和IBM COBOL这样的大语法时,这非常重要。是的,(...)节点显示在树中,但'('和')'的具体标记不显示。

  • 自动从AST重新生成源文本更容易。如果你没有保留括号节点,那么在漂亮印刷时要恢复插入它们的位置是很费力的。

  • 如果您在感兴趣的语言(我们这样做)的表面语法中编写模式和代码转换,那么无论如何都要用括号编写它们。并且匹配器不关心是否必须匹配“额外”节点。所以在使用树木时,这主要不是问题。 (偶尔我们会编写删除嵌套括号的规则,但写起来非常简单。)