#!/usr/bin/ruby ################################################### # Copyright (C) 2005 by Steve Litt, all rights reserved # This code licensed under the GNU General Public License, # version 2. NO WARRANTY, USE AT YOUR OWN RISK ################################################### require "Node.rb" #### CALLBACK OBJ HOUSES ENTRY AND EXIT CALLBACK ROUTINES, PLUS #### #### ANY PERSISTENT VARIABLES THOSE ROUTINES ACCESS #### class Callbacks def initialize() @namecat = "" @typecat = "" end def entry(checker, level) for i in 0...level print "\t" end print "Entering " + checker.value print " ... " unless checker.firstchild print ", Line ", checker.getAttribute("_lineno"), "\n" if checker.firstchild end def exit(checker, level) for i in 0...level;print "\t"; end if checker.firstchild print "Leaving " + checker.value print ", Line ", checker.getAttribute("_lineno"), "\n" end attr_reader :namecat, :typecat end #### MAIN ROUTINE FROM HERE TO BOTTOM #### parser = OutlineParser.new() ### Create parser object parser.skipblanks = true ### Change to false and watch what happens parser.commentchar = '#' ### Change to b and watch what happens node=parser.parse(nil) ### Parse from stdin #### NEXT 4 LINES MANUFACTURE A CONTRIVED NODE TO BE ULTIMATE PARENT #### #### YOU CAN DELETE THEM AND IT STILL WORKS, BECAUSE THE PARSER #### #### ITSELF INSTALLS A PARENT ABOVE ALL THE OUTLINE'S TOP NODES #### newnode = Node.new("MadeBySteveLitt", "contrived", "Made by Steve Litt") # node.setParent(newnode) ### Uncomment and it fails -- protected newnode.insertFirstChild(node) node = newnode cb = Callbacks.new() ### Instantiate callback obj #### INSTANTIATE WALKER OBJ WITH ENTRY AND EXIT CALLBACKS, THEN RUN IT #### #### NOTE THE SYNTAX WHEN USING REFERENCES TO THE SUBROUTINES AS ARGS #### #### ARGUMENT IS THE ULTIMATE PARENT OF THE TREE. #### #### NODE TREES CAN HAVE ONLY ONE PARENT. #### #### THAT'S WHY THE PARSER ITSELF INSTALLS A NODE ABOVE THE OUTLINE #### walker = Walker.new(node, cb.method(:entry), cb.method(:exit)) walker.walk()