#!/usr/bin/env rune # Copyright 2003-2004 Kevin Reid. # This source code and related files are distributed under the MIT License, as described in the document named "License.txt" which should be provided with this source distribution. pragma.enable("explicit-result-guard") pragma.disable("easy-return") def DEBuilderOf := if (interp.getArgs() =~ [filename]) { var nextTemp := 0 var lastCallNode := 0 var defines := [] var text := "" def dotBuilder implements DEBuilderOf(String, String) { to getNodeType() :near { String } to getRootType() :near { String } to buildRoot(root :String) :String { `digraph foo { $text "ROOT" -> $root; }` } to buildLiteral(value) :String { E.toQuote(E.toQuote(value)) } to buildImport(varName :String) :String { E.toQuote(varName) } to buildIbid(tempIndex :int) :String { `t_$tempIndex` } to buildCall(rec :String, verb :String, args :List[String]) :String { def node := E.toQuote(`call ${lastCallNode += 1}`) text += ` $node -> $rec [label = "receiver"]; $node [label = ${E.toQuote(verb)}]; ` for i => arg in args { text += `$node -> $arg [label = ${E.toQuote(E.toQuote(i))}];` } node } to buildDefine(rValue :String) :Tuple[String, int] { def tempIndex := nextTemp nextTemp += 1 text += `t_$tempIndex -> $rValue [label="define"];` [`t_$tempIndex`, tempIndex] } to buildPromise() :int { def promIndex := nextTemp nextTemp += 2 def pnode := `t_$promIndex` text += `$pnode [label="promise"];` promIndex } to buildDefrec(resIndex :int, rValue :String) :String { def pnode := `t_${resIndex - 1}` text += `$pnode -> $rValue;` rValue } } println( .recognize( [filename].getBytes(), #.recognize( # def a := [1, 2, 3, a], .wrap(dotBuilder), ) ) } else { stderr.println("Usage: $0 ") }