digraph G{ // Inheritance links between superclasses Expression -> Action [arrowhead="empty"]; Statement -> Action [arrowhead="empty"]; Action -> Any [arrowhead="empty"]; // Links on superclasses Statement -> Statement [label="next"]; // Inheritance hierarchy If -> Statement [arrowhead="empty"]; While -> Statement [arrowhead="empty"]; Assign -> Statement [arrowhead="empty"]; Call -> Statement [arrowhead="empty"]; Call -> Expression [arrowhead="empty"]; Break -> Statement [arrowhead="empty"]; Continue -> Statement [arrowhead="empty"]; Return -> Statement [arrowhead="empty"]; Resolve -> Statement [arrowhead="empty"]; Resolve -> Lvalue [arrowhead="empty"]; Access -> Expression [arrowhead="empty"]; Constant -> Expression [arrowhead="empty"]; Constant -> Lvalue [arrowhead="empty"]; Input -> Expression [arrowhead="empty"]; Output -> Statement [arrowhead="empty"]; Declare -> Statement [arrowhead="empty"]; Global -> Statement [arrowhead="empty"]; // Actual types // If If -> Expression [label="cond"]; If -> Statement [label="true"]; If -> Statement [label="false"]; // While While -> Expression [label="cond"]; While -> Statement [label="body"]; // Assign Assign -> Lvalue [label="var"]; Assign -> Expression [label="value"]; // Call Call -> Expression [label="func"]; Call -> Param [label="params"]; Call -> Param [label="last_param"]; // Break Break -> While [label="while"]; // Continue Continue -> While [label="while"]; // Return Return -> Expression [label="value"]; // Resolve Resolve -> Any [label="var"]; // Access Access -> Lvalue [label="var"]; // Constant Constant -> Any [label="node"]; // Input // Output Output -> Any [label="value"]; // Declare // Global Global -> String [label="var"]; // Param Param -> String [label="name"]; Param -> Expression [label="value"]; Param -> Param [label="next_param"]; // Function definition Funcdef -> Statement [label="body"]; }