我正在构建一个编译器,在其中我生成一个树,代表传入的源程序。我想显示这是一个像时尚的树,所以我可以向任何感兴趣的人显示程序的结构。
现在,我只需将树打印在一行上,如下所示:
ProgramNode -> 'Math' BlockNode -> DeclarationNode -> ConstantDeclarationNode -> const ConstantListNode -> [m := 7, ConstantANode -> [n := StringLiteralNode -> ""TEST"" ]] ;
我想要的是这样的:
ProgramNode
/ \
'Math' BlockNode
|
DeclarationNode
|
ConstantDeclarationNode ------------------------------
/ \ |
const ConstantListNode |
/ | \ \ |
m := 7 ConstantANode |
/ | \ |
n := StringLiteralNode |
/ | \ |
" TEST " ;
我还没有真正使用Ruby中的树,它们通常如何表示?
任何帮助都将不胜感激。
答案 0 :(得分:3)
这种漂亮的印刷需要相当多的数学。此外,如果树对于控制台窗口变得太宽,还不清楚会发生什么。我不知道任何现有的库都会这样做。我个人使用awesome_print
。
tree = {'ConstantDeclarationNode' => ['const',
'ConstantListNode' => ['m', ':=', '7']]}
require 'awesome_print'
ap tree
# >> {
# >> "ConstantDeclarationNode" => [
# >> [0] "const",
# >> [1] {
# >> "ConstantListNode" => [
# >> [0] "m",
# >> [1] ":=",
# >> [2] "7"
# >> ]
# >> }
# >> ]
# >> }
它有很多选项,请查看!
答案 1 :(得分:2)
您需要查看Graph gem。它非常棒且非常简单。您可以选择树的方向和节点的形状,以及颜色等等。去年我第一次在Rubyconf上发现了它并且被吹走了。
这很简单:
digraph do
edge "Programnode", "Blocknode"
edge "Programnode", "Math"
edge "Blocknode", "DeclarationNode"
end
显然你想要以编程方式输入边缘:)
这是谈话的link to a pdf,它将提供更多信息:
如果您有兴趣,还可以在Confreaks上播放该视频。
干杯, 肖恩