#!/usr/local/bin/perl -w
use Getopt::Std;

sub usage { <<EOM;
$0 file1 file2
	If input has just trees preceded by sentence numbers, output will
	be a merge of the two files, with unique trees thrown out.  
	Remaining trees will be those with the same sentence number, 
	start word, and end word, first from file1, then from file2.
EOM
}

my %opt;
getopts ('h', \%opt);

if ($opt{h}) { die usage(); }
if (@ARGV < 2) { die usage(); }


my @file1 = makeFileThingy(shift);
my @file2 = makeFileThingy(shift);

my (@sbuf1, @sbuf2);

until (eof $file1[0] && eof $file2[0]) {
  doComp(\@file1, \@sbuf1, \@sbuf2, 0);
  doComp(\@file2, \@sbuf2, \@sbuf1, 1);
}

sub makeFileThingy {
  my $filename = shift;
  my $fh;
  open $fh, $filename;
  my $buffer = '';
  return ($fh, \$buffer);
}

sub readTree {
  my ($fh, $bufref) = @_;
  my $curtree = $$bufref;
  while (<$fh>) {
    if ($curtree && /^(\d+:\s*)?\(/) {
      $$bufref = $_;
      return $curtree;
    } else {
      $curtree .= $_;
    }
  }
  $$bufref = '';
  return $curtree;
}

sub getSentNum {
  my $sent = shift;
  $sent =~ /^(\d+)/ or warn "getSentNum confused on $sent";
  return $1;
}

sub getFirstWord {
  my $sent = shift;
  $sent =~ /([^\s\)]+)\)/ or warn "getFirstWord confused on $sent";
  return $1;
}

sub getLastWord {
  my $sent = shift;
  $sent =~ /([^\s\)]+)[\)\s]+$/s or warn "getLastWord confused on >$sent<";
  return $1;
}

sub doCompAux {
  my ($sent, $sbufref) = @_;
  my ($snum, $sfirst, $slast) =
    (getSentNum($sent), getFirstWord($sent), getLastWord($sent));
  for my $i (0 .. $#$sbufref) {
    if ($snum == getSentNum($$sbufref[$i])
        && $sfirst eq getFirstWord($$sbufref[$i])
        && $slast eq getLastWord($$sbufref[$i])) {
      splice @$sbufref, 0, $i ;
      return 1;
    }
  }
  return 0;
}

sub doComp {
  my ($file1ref, $sbuf1ref, $sbuf2ref, $order) = @_;
  my $sent = readTree(@$file1ref);
  if (!$sent) { return; }
  if (doCompAux ($sent, $sbuf2ref)) {
    if ($order == 0) {
      print $sent;
      print (shift @$sbuf2ref);
    } else {
      print (shift @$sbuf2ref);
      print $sent;
    }
    @$sbuf1ref = ();
  } else {
    push @$sbuf1ref, $sent;
  }
}
