#!/usr/bin/perl -w

use strict;
use warnings;

use Data::Dumper;

$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
$Data::Dumper::Deepcopy = 1;

local $.;

my @table = ();

while (<>) {
    next if /^\s*$/ or /^\s*#/;

    /^\s*(.*?)\s*=>\s*(.*?)\s*$/ or die "Erro na linha ".$..".\n";

    my $left = $1;
    my $right = $2;

    my $palavra = '(?:(?:(?:\(.*?\))|\S+)\??)';

    my @ps;

    while ($left =~ /($palavra)/g) {
	my $spec = $1;
	my $entry = {};
	$spec =~ s/\?$// and $entry->{optional} = 1;
	if ($spec =~ /\((.*?)\)/) {
	    $entry->{choice} = [split ' ', $1];
	} else {
	    $entry->{choice} = [$spec];
	}
	#$entry->{optional} = 1 if $spec =~ /\?$/;
	push @ps, $entry;
    }

    die "No left-hand side at line $.".".\n" if @ps == 0;
    die "No more than two words of context supported (line $.".").\n"
	if @ps > 2;

    my %meaning = (confidence => 80);
    # se primeira letra da primeira palavra é maiúscula então gobble = 1
    if ($left =~ /\W*(\w)/ and uc($1) eq $1) {
	$meaning{gobble} = "always";
    } else {
	$meaning{gobble} = 0;
    }
    
    # contexto é sempre excluído do texto da referência
    $right =~ s/!exclude// and $meaning{gobble} = 0;
    # contexto é sempre incluído do texto da referência
    $right =~ s/!include// and $meaning{gobble} = "always";
    # contexto mantém-se fora ou dentro do texto da referência
    $right =~ s/!keep// and $meaning{gobble} = 1;
    # contexto só usado para contextos esquerdos
    $right =~ s/!lctx// and $meaning{noentname} = 1;
    # contexto só usado para primeiras palavras de entidade
    $right =~ s/!entname// and $meaning{noleftctx} = 1;

    $right =~ s!/(\d+)!! and $meaning{confidence} = $1;
    $right =~ s!^\s*!!;
    $right =~ s!\s*$!!;
    die "Classificação não especificada do lado direito na linha $.".".\n" if $right eq '';
    $meaning{is} = $right;

    if (@ps == 2 and $ps[1]->{optional}) {
	delete $ps[1]->{optional};
	push @table, [ [$ps[0]], \%meaning];
    }
    push @table, [\@ps, \%meaning];
}

print Dumper(\@table);

