我对如何表示AST中的括号感到困惑。我知道怎么做一个解析树,朋友告诉我AST不会包含括号,我无法从任何文本中验证
答案 0 :(得分:2)
你的朋友是对的,抽象语法树不包含括号。括号只控制树的结构,它们本身不会出现在树中。
因此,a*(b+c)
会创建一个树,其中a
是*
的左子项,而右子项是另一个子树,其中b
和c
是+
的孩子。 a*b+c
和(a*b)+c
两者都会创建一个树为+
的树,*
为子a
和b
为左子+
和c
是+
的正确孩子。
我无法从任何文本验证
来自抽象语法树上的Wikipedia article:
语法是“抽象的”,不代表真实语法中出现的每个细节。例如,分组括号隐含在树结构中
答案 1 :(得分:1)
AST的标准智慧是它们不包含表达式中的括号。 这实际上只是一个品味问题。你可以这样做。
抽象点是某些细节被删除。
有人可能决定放弃除括号之外的其他细节;你仍然得到一个抽象的语法树。例如,如果你采用完全具体的语法树,并删除所有具有固定拼写的终端节点(包括'+','IF'和'(')),你会得到一个很好的抽象语法树。
我构建了一个程序分析和转换工具,可以从原始语法中自动完成这种抽象(和其他几个)。它有一些非常好的好处:
从语法构建解析器时,您可以自动构造AST而无需手动编写任何代码。在构建和维护像C ++ 14和IBM COBOL这样的大语法时,这非常重要。是的,(...)节点显示在树中,但'('和')'的具体标记不显示。
自动从AST重新生成源文本更容易。如果你没有保留括号节点,那么在漂亮印刷时要恢复插入它们的位置是很费力的。
如果您在感兴趣的语言(我们这样做)的表面语法中编写模式和代码转换,那么无论如何都要用括号编写它们。并且匹配器不关心是否必须匹配“额外”节点。所以在使用树木时,这主要不是问题。 (偶尔我们会编写删除嵌套括号的规则,但写起来非常简单。)