#! /usr/bin/perl -w

use strict;

sub substvariables;
sub ReadFileToString;

my $tokenfile = shift;

my %values = ();
my @token=();

(my $script = $0) =~ s#.*/##g;

my $tokentext = ReadFileToString($tokenfile);
for (split "\n", $tokentext) {
  my $token;

  s/#.*//;
  s/^\s*//; 
  s/\s.*$//;
  next if $_ eq "";
  ($token) = split;
  push @token, $token;
}
@token = sort @token;


my $value;

############################################################
# LEXTOKEN

$value = "";
for my $token (@token) {
  $value .= sprintf "<norm>%s { RETURN_TOKEN(TOKEN_%s); }\n\n", $token, uc $token;
}

$values{"LEXTOKEN"} = $value;
############################################################
# YACCTOKEN

$value = "";
for my $token (@token) {
  $value .= sprintf "%%token TOKEN_%s\n", uc $token;
}

$values{"YACCTOKEN"} = $value;
############################################################

my $text = join "", <>;
$text = substvariables($text);
print $text;

exit 0;

sub substvariables {
  (my $string) = @_;
  my $value; my $from; my $to;
  my $count;
  do {
    $count = 0;
    foreach $value (keys %values) {
      $from = "@" . $value . "@";
      $to = $values{$value};
      # print "$from: OK\n" if $string =~ m/$from/;
      $count += ($string =~ s/$from/$to/g);
      # print "`$from' -> `$to' : $count\n";
    }
  } while($count);
  return $string;
}

sub ReadFileToString {
  (my $filename) = @_;

  die "$script: can't read $filename: $!\n" unless open FILE, "$filename";
  my $sep = $/;
  $/ = '';
  my $text ="";
  while (<FILE>) {
    $text .= $_;
  }
  close FILE;
  $/ = $sep;
  return $text;
}

