App-Navegante

 view release on metacpan or  search on metacpan

lib/App/Navegante.yp  view on Meta::CPAN

%%
f       : actions fop {+{ action=>$_[1], %{$_[2]}}} ;

fop     : FIM {+{perl => $_[1]}} | {+{}} ;

actions : actions  'save' actarg         {+{ %{$_[1]}, save => $_[3]}}
        | actions  'mail' actarg         {+{ %{$_[1]}, mail => $_[3]}}
        | actions  'init' STRING         {+{ %{$_[1]}, init => $_[3]}}
        | actions  'desc' STRING         {+{ %{$_[1]}, desc => $_[3]}}
        | actions  'proc' STRING         {+{ %{$_[1]}, proc => $_[3]}}
        | actions  'proctags' STRING         {+{ %{$_[1]}, proctags => $_[3]}}
        | actions  'livefeedback' STRING   {+{ %{$_[1]}, livefeedback => $_[3]}}
        | actions  'feedback' STRING     {+{ %{$_[1]}, feedback => $_[3]}}
        | actions  'annotate' STRING     {+{ %{$_[1]}, annotate => $_[3]}}
        | actions  'iform' STRING     {+{ %{$_[1]}, iform => $_[3]}}
        | actions  'iframe' STRING     {+{ %{$_[1]}, iframe => $_[3]}}
        | actions  'quit' STRING     {+{ %{$_[1]}, quit => $_[3]}}
        | actions  'formtitle' STRING    {+{ %{$_[1]}, formtitle => $_[3]}}
        | actions  'filename' STRING      {+{ %{$_[1]}, filename => $_[3]}}
        | actions  'protect' STRING      {+{ %{$_[1]}, protect => $_[3]}}
        |                                {+{}}
        ;

actarg  : STRING            { +{arg=>$_[1]}}
        | STRING ':' ID     { +{arg=>$_[1], feedback => $_[3] }}
        ;

%%

package App::Navegante;
use lib './lib/';
use CGI qw( :all :nodebug);
use Data::Dumper;
use App::Navegante::CGI;

my $File;
my $t = parseFile();

preparafiles($t->{action}) if $t->{action};
geraCgi($t);

sub preparafiles{
  my $a= shift;
  if($a->{save} && !-e $a->{save}{arg}){
      open(F,">$a->{save}{arg}") or die ("cant create $a->{save}{arg}\n");
      print F "##Created by FormLang\n";
      close F;
      chmod (0666,$a->{save}{arg})
  }
}

sub geraCgi{
    my %args = (%{$_[0]{action}}, PERL=>$_[0]{perl});
    my $t = App::Navegante::CGI->new(%args);

    if( defined $_[0]{action}{filename}) {
        open(F,">$_[0]{action}{filename}") or die ("cant create $_[0]{action}{filename}");
        print F $t->createCGI();
        close(F);
        chmod(0755,$_[0]{action}{filename});
    }
    else {
        print $t->createCGI();
    }
}

sub yyerror {
  if ($_[0]->YYCurtok) {
      printf STDERR ('Error: a "%s" (%s) was fond where %s was expected'."\n",
         $_[0]->YYCurtok, $_[0]->YYCurval, $_[0]->YYExpect)
  }
  else { print  STDERR "Expecting one of ",join(", ",$_[0]->YYExpect),"\n";
  }
}

sub parseFile {
  my $p = new Navegante();
  init_lex();
  $p->YYParse(
      yylex   => \&lex,
      yyerror => \&yyerror
  );
}

sub init_lex{
 local $/;
 undef $/;
 $File = <>
}


sub lex{
 for($File){
   s!^\s+!!;
   if($_ eq "")             {    return ("","") }
   s!^\(([^)]+)\)!!          and return("STRING",$1);
   s!^([\{\}\[\];+*/,:])!!   and return($1,$1);
   s!^\((.*?)\)!!            and return("ARG",$1);
   s!^##(.*)$!!s             and return("FIM",$1);
   s!^(init|desc|formtitle|save|mail|filename|feedback|proc|proctags|livefeedback|annotate|iform|iframe|quit|protect)\b!!
                             and return($1,$1);
   s!^(\w+)!!                and return("ID",$1);

   print STDERR "Simbolos desconhecidos '$File'\n" ;
 }
}



( run in 2.719 seconds using v1.01-cache-2.11-cpan-56fb94df46f )