# -*- perl -*-
#
# $Id: LexTable.pm,v 1.2 1996/06/19 20:29:05 qjb Exp $
# $Source: /home/qjb/source/perl/modules/RCS/LexTable.pm,v $
# $Author: qjb $
#

require 5.002;
use strict;

package LexTable;
my $package = "LexTable";

use qutils qw(:assert_args);

# Field names
my $f_eof_token = "eof_token";
my $f_initial_state = "initial_state";
my $f_states = "states";

# Static Variables

# Routines

sub new
{
    &assert_args(\@_, ["", "", "", "HASH"], []) if $assert_args;

    my $class = shift;
    my $rep = +{$package => {} };
    my ($eof_token, $initial_state, $states) = @_;

    if (! exists $states->{$initial_state})
    {
	die "$package: initial state ($initial_state) " .
	    "does not exist in state table.\n";
    }

    my $state;
    foreach $state (values(%$states))
    {
	my $matches;
	foreach $matches (@$state)
	{
	    if (scalar(@$matches) != 3)
	    {
		die "$package: each element of each matches array must be a " .
		    "three-element array reference.\n";
	    }
	    my $new_state = $matches->[2];
	    if (defined($new_state) && (! exists $states->{$new_state}))
	    {
		die "$package: new state $new_state does not exist in " .
		    "state table.\n";
	    }
	}
    }

    $rep->{$package}{$f_eof_token} = $eof_token;
    $rep->{$package}{$f_initial_state} = $initial_state;
    $rep->{$package}{$f_states} = $states;

    bless $rep, $class;
}

sub eof_token
{
    my $rep = shift;
    $rep->{$package}{$f_eof_token};
}

sub initial_state
{
    my $rep = shift;
    $rep->{$package}{$f_initial_state};
}

sub states
{
    my $rep = shift;
    $rep->{$package}{$f_states};
}

1;

#
# END OF LexTable
#
