%strict
%token Bbork
%token an
%token An
%token au
%token Au
%token ax
%token Ax
%token en
%token ew
%token edone
%token ex
%token Ex
%token f
%token ir
%token i
%token ow
%token o
%token O
%token xo
%token the
%token The
%token th
%token tion
%token u
%token U
%token v
%token V
%token w
%token W
%token NW
%token WC
%token NL
%token EOS
%start chef
%{
open OUT, ">parserchefeyapp";
%}
%%
chef : token +
;
token : EOS
{ print OUT $_[1] . "Bork Bork Bork!\n" }
| Bbork
{ print OUT $_[1] }
| an
{ print OUT 'un' }
| An
{ print OUT 'Un' }
| au
{ print OUT 'oo' }
| Au
{ print OUT 'Oo' }
| ax
{ print OUT 'e' }
| Ax
{ print OUT 'E' }
| en
{ print OUT 'ee' }
| ew
{ print OUT 'oo' }
| edone
{ print OUT 'e-a' }
| ex
{ print OUT 'i' }
| Ex
{ print OUT 'I' }
| f
{ print OUT 'ff' }
| ir
{ print OUT 'ur' }
| i
{ print OUT 'ee' }
| ow
{ print OUT 'oo' }
| o
{ print OUT 'oo' }
| O
{ print OUT 'Oo' }
| xo
{ print OUT 'u' }
| the
{ print OUT 'zee' }
| The
{ print OUT 'Zee' }
| th
{ print OUT 't' }
| tion
{ print OUT 'shun' }
| u
{ print OUT 'oo' }
| U
{ print OUT 'Oo' }
| v
{ print OUT 'f' }
| V
{ print OUT 'F' }
| w
{ print OUT 'v' }
| W
{ print OUT 'V' }
| NW
{ print OUT $_[1] }
| WC
{ print OUT $_[1] }
| NL
{ print OUT $_[1] }
;
%%
package main;
my $niw = 0;
my $i_seen = 0;
my $File;
my $t = Run();
close OUT;
sub lexical_analyse {
my $WC = qr/[A-Za-z']/;
my $NW = qr/[^A-Za-z']/;
for ($File) {
!$niw and m{\G([Bb]ork)(?=$NW)}gc and do { return ('Bbork',$1) };
m{\G(an)}gc and do { $niw = 1; return ($1,$1) };
m{\G(An)}gc and do { $niw = 1; return ($1,$1) };
m{\G(au)}gc and do { $niw = 1; return ($1,$1) };
m{\G(Au)}gc and do { $niw = 1; return ($1,$1) };
m{\G(a)(?=$WC)}gc and do { $niw = 1; return ('ax',$1) };
m{\G(A)(?=$WC)}gc and do { $niw = 1; return ('Ax',$1) };
m{\G(en)(?=$NW)}gc and do { $niw = 1; return ($1,$1) };
$niw and m{\G(ew)}gc and do { $niw = 1; return ($1,$1) };
$niw and m{\G(e)(?=$NW)}gc and do { $niw = 1; return ('edone',$1) };
!$niw and m{\G(e)}gc and do { $niw = 1; return ('ex',$1) };
!$niw and m{\G(E)}gc and do { $niw = 1; return ('Ex',$1) };
$niw and m{\G(f)}gc and do { $niw = 1; return ($1,$1) };
$niw and m{\G(ir)}gc and do { $niw = 1; return ($1,$1) };
($niw and !$i_seen) and m{\G(i)}gc and do { $niw = 1; $i_seen = 1; return ($1,$1) };
!$niw and m{\G(ow)}gc and do { $niw = 1; return ($1,$1) };
!$niw and m{\G(o)}gc and do { $niw = 1; return ($1,$1) };
!$niw and m{\G(O)}gc and do { $niw = 1; return ($1,$1) };
$niw and m{\G(o)}gc and do { $niw = 1; return ('xo',$1) };
m{\G(the)}gc and do { $niw = 1; return ($1,$1) };
m{\G(The)}gc and do { $niw = 1; return ($1,$1) };
m{\G(th)(?=$NW)}gc and do { $niw = 1; return ($1,$1) };
$niw and m{\G(tion)}gc and do { $niw = 1; return ($1,$1) };
$niw and m{\G(u)}gc and do { $niw = 1; return ($1,$1) };
$niw and m{\G(U)}gc and do { $niw = 1; return ($1,$1) };
m{\G(v)}gc and do { $niw = 1; return ($1,$1) };
m{\G(V)}gc and do { $niw = 1; return ($1,$1) };
m{\G(w)}gc and do { $niw = 1; return ($1,$1) };
m{\G(W)}gc and do { $niw = 1; return ($1,$1) };
m{\G([.?!]+\s+)}gc and do { $niw = 0; $i_seen = 0; return ('EOS',$1) };
m{\G($WC)}gc and do { $niw = 1; return ('WC',$1) };
m{\G($NW)}gc and do { $niw = 0; $i_seen = 0; return ('NW',$1) };
m{\G(/\n/)}gc and do { $niw = 0; $i_seen = 0; return ('NL',$1) };
# m{\G(/\Z/)}gc and do { return ('NS',$1) };
return ('',undef);
}
}
sub yyerror {
my $parser = shift;
my $expected = $parser->YYExpect;
my $got = $parser->YYCurtok;
die "Parse Error: Expected $expected, got $got\n";
}
sub Run {
my $parser = new chefeyapp();
local $/;
undef $/;
while (<>) {
$File = $_;
$parser->YYParse( yylex => \&lexical_analyse, yyerror => \&yyerror );
}
}