#!/bin/perl
# 
# Hacky parser for Squish
# Todo: 
# - port to Ruby, adapt to use Racc and/or organise properly
# - be clearer about the structure it parses to

# this was my old *nasty* Perl parser. The new one is 
# at least prettier than this...
# $Id: squish2algae.pl,v 1.1 2002/02/28 02:09:16 danbri Exp $
# danbri@w3.org

use strict;

my $file = shift;
my $squish;
open(IN,$file) || die "Can't open query file: $file";
while(<IN>){ $squish .= $_; }
close IN;

print squish2algae($squish);


sub squish2algae {
  my $squish = shift; 
  chomp $squish;

  $squish =~ s/\n/ /g;
  $squish =~ s/\r/ /g;
  $squish =~ m/SELECT\s+(.*)\s*WHERE\s*(.*)\s*USING\s*(.*)/i;

  my $SELECT = $1;
  my $WHERE = $2;
  my $USING = $3;
  my $FROM;
  if ($SELECT =~ s/FROM\s+(.*)//i) { 
    $FROM=$1;
  }

  $SELECT =~ s/SELECT//i;
  $FROM =~ s/FROM//i;
  $WHERE =~ s/WHERE//i;
  $USING =~ s/USING//i;
 
  my @selects = split (/\s+/, $SELECT);
  my @froms = split (/\s+/, $FROM);

  my $dbg = "Select: \t$SELECT \n\tFrom: $FROM\n\tWhere: $WHERE\n\tUsing: $USING \n";

  my %ns;
  my @spaces = split(/\s*AND\s*/i, $USING);
  if (! @spaces) { push (@spaces, $USING) };

  my $pairs = $USING;  # note: squish syntax underspecified! :(
  $pairs =~ s/for//ig;
  $pairs =~ s/as//ig;
  $pairs =~ s/and//ig; # sugar; see #todo at top of file
  my @nslist = split(/\s+/,$pairs);
  while (@nslist) {
    my ($x,$y) = (shift @nslist, shift @nslist);
    chomp $y;
    $ns{$x} = $y;
  }

  $WHERE =~ s/(\w+)::/$ns{$1}/ig;
  $WHERE =~ s/\)\s*\(/)\n\t(/g;

  $SELECT =~ s/,//g; # desugar: no commas in var names

  my $algae;
  $algae .= "(ask '(\n";
  $algae .= "$WHERE\n";
  $algae .= ") collect '( $SELECT )\n )\n";

  return $algae;
}

