# Copyright (C) 2006-2009, Parrot Foundation.

=head1 NAME

transform - transform a sample tree of Branch and Leaf nodes

=head1 SYNOPSIS

  # must be run from this directory ...
  $ ../../../parrot transform.pir branch.g

=head1 DESCRIPTION

This example script constructs a tree grammar from a tree grammar syntax
file, and uses the constructed grammar to transform a tree of the
specified type.

=cut

.sub _main :main
    .param pmc argv

    load_bytecode 'TGE.pbc'
    load_bytecode 'lib/Leaf.pir'
    load_bytecode 'lib/Branch.pir'

    # Load the syntax file
    .local string source
    source = _get_source(argv)

    # Compile a grammar from the source grammar file
    .local pmc grammar
    $P1 = new ['TGE';'Compiler']
    grammar = $P1.'compile'(source)

    # Build up the tree for testing
    .local pmc tree
    tree = buildtree()

    # Apply the grammar to the test tree
    .local pmc AGI
    AGI = grammar.'apply'(tree)

    # Retrieve the value of a top level attribute
    $P4 = AGI.'get'('gmin')
    print "----\nthe global minimum attribute value is: "
    print $P4
    print " of type: "
    $S4 = typeof $P4
    print $S4
    print "\n"

    # Retrieve the transformed tree
    $P5 = AGI.'get'('result')
#    $S5 = typeof $P5
#    print $S5
#    print "\n"

    $P6 = getattribute tree, 'left'
    $P7 = getattribute $P6, 'left'
    $P8 = getattribute $P7, 'value'
    print "----\nbefore transform, the value of the left-most leaf is: "
    print $P8
    print "\n"

    $P6 = getattribute $P5, 'left'
    $P7 = getattribute $P6, 'left'
    $P8 = getattribute $P7, 'value'
    print "after transform, the value of the left-most leaf is: "
    print $P8
    print "\n"

    $P10 = getattribute tree, 'right'
    $P11 = getattribute $P10, 'right'
    $P12 = getattribute $P11, 'right'
    $P13 = getattribute $P12, 'value'
    print "----\nbefore transform, the value of the right-most leaf is: "
    print $P13
    print "\n"

    $P10 = getattribute $P5, 'right'
    $P11 = getattribute $P10, 'right'
    $P12 = getattribute $P11, 'right'
    $P13 = getattribute $P12, 'value'
    print "after transform, the value of the right-most leaf is: "
    print $P13
    print "\n----\n"

    end

  err_parse:
    print "Unable to parse the tree grammar.\n"
    end
.end


# Read in the source either from a file or from STDIN
.sub _get_source
    .param pmc argv

    .local pmc filehandle
    .local string filename

    $I0 = argv
    if $I0 == 2 goto fromfile

    $P0 = getinterp
    filehandle = $P0.'stdin_handle'()
    goto grabline

  fromfile:
    # Read in the source file
    filename = argv[1]
    filehandle = new ['FileHandle']
    filehandle.'open'(filename, 'r')

  grabline:
    $S1 = filehandle.'read'(65535)
#    $S1 = readline filehandle
#    print $S1

    if $I0 != 2 goto finished
    filehandle.'close'()

  finished:
    .return ($S1)
.end


# ----------------------------------
.sub buildtree
    $P0 = build_Leaf(5)
    $P1 = build_Leaf(9)
    $P2 = build_Branch($P0, $P1)

    $P3 = build_Leaf(1)
    $P4 = build_Branch($P3, $P2)

    $P5 = build_Leaf(2)
    $P6 = build_Leaf(3)
    $P7 = build_Branch($P5, $P6)

    $P8 = build_Branch($P7, $P4)

    .return($P8)
.end

.sub build_Leaf
    .param int value
    .local pmc newnode
    newnode = new 'Leaf'
    $P1 = new 'Integer'
    $P1 = value
    setattribute newnode, 'value', $P1
    .return(newnode)
.end

.sub build_Branch
    .param pmc left_child
    .param pmc right_child
    .local pmc newnode
    newnode = new 'Branch'
    setattribute newnode, 'left', left_child
    setattribute newnode, 'right', right_child
    .return(newnode)
.end

=head1 AUTHOR

Allison Randal <allison@perl.org>

=cut

# Local Variables:
#   mode: pir
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir:
