Grammar-Graph
view release on metacpan or search on metacpan
lib/Grammar/Graph.pm view on Meta::CPAN
#####################################################################
# Types
#####################################################################
package Grammar::Graph::Types;
use Modern::Perl;
use parent qw/Type::Library/;
use Type::Utils;
use Types::Standard qw/Int/;
declare 'Vertex',
as Int,
where { $_ > 0 };
#####################################################################
# Role for non-terminal names
#####################################################################
package Grammar::Graph::Named;
use Modern::Perl;
use Moose::Role;
has 'name' => (
is => 'ro',
required => 1,
isa => 'Str'
);
#####################################################################
# Role for coupled vertices
#####################################################################
package Grammar::Graph::Coupled;
use Modern::Perl;
use Moose::Role;
has 'partner' => (
is => 'ro',
required => 1,
writer => '_set_partner',
isa => Grammar::Graph::Types::Vertex(),
);
#####################################################################
# Start
#####################################################################
package Grammar::Graph::Start;
use Modern::Perl;
use Moose;
extends 'Grammar::Formal::Empty';
with 'Grammar::Graph::Coupled',
'Grammar::Graph::Named';
#####################################################################
# Final
#####################################################################
package Grammar::Graph::Final;
use Modern::Perl;
use Moose;
extends 'Grammar::Formal::Empty';
with 'Grammar::Graph::Coupled',
'Grammar::Graph::Named';
#####################################################################
# Conditionals
#####################################################################
package Grammar::Graph::Conditional;
use Modern::Perl;
use Moose;
extends qw/Grammar::Formal::Empty/;
with qw/Grammar::Graph::Coupled/;
has 'p1' => (
is => 'ro',
required => 1,
isa => Grammar::Graph::Types::Vertex()
);
has 'p2' => (
is => 'ro',
required => 1,
isa => Grammar::Graph::Types::Vertex()
);
has 'name' => (
is => 'ro',
required => 1,
isa => 'Str'
);
#####################################################################
# If (start of conditional)
#####################################################################
package Grammar::Graph::If;
use Modern::Perl;
use Moose;
extends 'Grammar::Graph::Conditional';
#####################################################################
# Fi (end of conditional)
#####################################################################
package Grammar::Graph::Fi;
use Modern::Perl;
use Moose;
extends 'Grammar::Graph::Conditional';
#####################################################################
# Operands
#####################################################################
package Grammar::Graph::Operand;
use Modern::Perl;
use Moose;
extends 'Grammar::Formal::Empty';
with qw/Grammar::Graph::Coupled/;
#####################################################################
# Prelude (character before any other)
#####################################################################
package Grammar::Graph::Prelude;
use Modern::Perl;
use Moose;
extends 'Grammar::Formal::CharClass';
with qw/Grammar::Graph::Coupled/;
has '+spans' => (
required => 0,
default => sub {
Set::IntSpan->new([-1])
},
);
#####################################################################
# Postlude (character after any other)
#####################################################################
package Grammar::Graph::Postlude;
use Modern::Perl;
use Moose;
extends 'Grammar::Formal::CharClass';
with qw/Grammar::Graph::Coupled/;
has '+spans' => (
required => 0,
default => sub {
Set::IntSpan->new([-1])
},
);
#####################################################################
# Grammar::Graph
#####################################################################
package Grammar::Graph;
use 5.012000;
use Modern::Perl;
use Grammar::Formal;
use List::UtilsBy qw/partition_by/;
use List::MoreUtils qw/uniq/;
use List::Util qw/shuffle sum max/;
use Storable qw/freeze thaw/;
use Graph::SomeUtils qw/:all/;
use Graph::Directed;
use Moose;
#####################################################################
# Globals
#####################################################################
local $Storable::canonical = 1;
our $VERSION = '0.20';
our %EXPORT_TAGS = ( 'all' => [ qw(
) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
);
#####################################################################
# Attributes
#####################################################################
has 'g' => (
is => 'ro',
required => 1,
isa => 'Graph::Directed',
default => sub { Graph::Directed->new },
);
has 'symbol_table' => (
is => 'ro',
required => 1,
isa => 'HashRef',
default => sub { {} },
);
has 'start_vertex' => (
is => 'ro',
required => 0, # FIXME?
writer => '_set_start_vertex',
isa => Grammar::Graph::Types::Vertex(),
);
has 'final_vertex' => (
is => 'ro',
required => 0, # FIXME?
writer => '_set_final_vertex',
isa => Grammar::Graph::Types::Vertex(),
);
has 'pattern_converters' => (
is => 'ro',
( run in 2.770 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )