如果我想构建一个抽象语法树,关于规则右侧的项目数量的最佳实践是什么?

If I want to build an Abstract Syntax Tree, what is best practice with respect to the number of items on the right-hand side of rules?

我使用 Flex & Bison 生成了一个解析器。解析器工作得很好。它生成一个 XML 文档。它有这样的规则:

monthdatetime: TWODIGITS TWODIGITS TWODIGITS TWODIGITS timezone { $$ = concat(10, "<MonthNumeric>", , "</MonthNumeric><Day>", , "</Day><HourTime>", , "</HourTime><MinuteTime>", , "</MinuteTime>", ); }

现在我想用构建抽象语法树 (AST) 的动作替换动作。启动规则的操作将是调用一个“序列化”函数,该函数遍历 AST 以一举生成 XML。

这是我的计划。

在我上面显示的规则中,右侧有 5 个项目。有些规则有更多的项目。哎呀!我应该将 AST 设计为支持具有任意数量分支(N 元节点)的节点吗?在上面的规则中,我需要用这样的操作替换操作:

{ $$ = new_ast("field", , , , , ); } 

这样走好吗?或者,我是否应该重新设计我的规则,使每个规则的右侧最多包含两个项目?这样,我就可以创建一个作为二叉树的 AST。

你有什么推荐?关于规则右侧的项目数,是否有设计解析器规则的最佳实践?创建二叉树的 AST 还是创建 N 叉树的 AST 更好?

这是关于计算机科学的。任何树结构(具有 n 路分支)都可以用来表示所有其他具有 m 分支的树。

如果 m 小于 n 这是微不足道的,因为 null 用于填充 n-m 个子条目。当 n 等于 m 时也没有问题。

您问的是当 m 大于 n 时该怎么办。简单的;使它们成为子树,这很容易完成。假设您希望在树节点中有 9 个项目,而只有 space 表示 5(如您的示例),您可以这样编码:

{$$ = new_ast("field",,,,, new_ast("child",,,,,)); }

现在你以后的tree-walk就会知道这是一个更长的节点。