#!/usr/tools/bin/perl
# $Id: bnf2yacc.pl,v 1.1 1994/03/11 21:06:48 connolly Exp $

while(<>){
    chop;

    next if '^#';

    if(/^\S/){
	if($left && $right){
	    $right =~ s/^\s+//;
	    $right =~ s/\s+$//;
	    push(@Terms, $left);
	    $BNF{$left} = $right;
	}
	s/\s//g;
	$left = $_;
	undef($right);
    }else{
	$right .= $_;
    }
}

foreach (@Terms){
#    print STDERR "<$_> ::= ", $BNF{$_}, "\n\n";
}

$Term = "Bracket00";

print "/* Machine Translation from BNF */\n%%\n";

foreach $left (@Terms){
    local(@right);
    @right = split(/\s+/, $BNF{$left});

    $rule = &make_rule();
    print "$left : $rule \n\t;\n\n";
}

sub make_rule{
    local(@yacc);
    local($_);
    local($ret);

    while (($_ = shift(@right)) gt ''){
	if($_ eq ']'){
	    last;
	}
	elsif($_ eq '['){
	    local($rule);
	    $rule = "/* void */ | " . &make_rule();
	    push(@yacc, $Term);
	    print "$Term : $rule \n\t;\n";
#	    print STDERR keys %Yacc;
	    $Term++;
	}
	elsif($_ eq '|'){
	    push(@yacc, $_);
	}
	elsif(length($_) == 1){
	    $_ = "\\'" if $_ eq "'";
	    $_ = "\\\\" if $_ eq "\\";
	    push(@yacc, "'" . $_ . "'");
	}
	else{
	    if($_ eq 'space'){
		$_ = '" "';
	    }
	    elsif($_ eq 'void'){
		$_ = '/* void */';
	    }
	    elsif($_ eq 'vline'){
		$_  = '|';
	    }
	    elsif($BNF{$_}){
		push(@yacc, $_);
	    }else{
		warn "what is $_???";
	    }
	}
    }

    $ret = join(' ', @yacc);
#    print STDERR "made: ", $ret, "\n";
    return $ret;
}
