Attean
view release on metacpan or search on metacpan
lib/AtteanX/Functions/CompositeLists.pm view on Meta::CPAN
use v5.14;
use warnings;
use utf8;
=head1 NAME
AtteanX::Functions::CompositeLists - Functions and aggregates to work with composite lists
=head1 VERSION
This document describes AtteanX::Functions::CompositeLists version 0.039
=head1 SYNOPSIS
use v5.14;
use Attean;
=head1 DESCRIPTION
This is a utility package that defines functions and aggregates to work with
composite list datatypes.
=over 4
=cut
package AtteanX::Functions::CompositeLists::TurtleLexerWithNull {
use Moo;
use AtteanX::Parser::Turtle;
use AtteanX::SPARQL::Constants;
extends 'AtteanX::Parser::Turtle::Lexer';
sub get_token {
my $self = shift;
while (1) {
$self->fill_buffer unless (length($self->buffer));
if ($self->buffer =~ /^[ \r\n\t]+/o) {
my $start_column = $self->column;
my $start_line = $self->line;
my $ws = $self->read_length($+[0]);
# we're ignoring whitespace tokens, but we could return them here instead of falling through to the 'next':
unless ($self->ignore_whitespace) {
return $self->new_token(WS, $start_line, $start_column, $ws);
}
next;
}
my $c = $self->peek_char();
return unless (defined($c));
if ($c eq ':') {
$self->read_length(1);
return AtteanX::Parser::Turtle::Token->fast_constructor(PREFIXNAME, -1, -1, -1, -1, [':']);
}
if ($self->buffer =~ /^null\b/) {
$self->read_length($+[0]);
return 1;
}
return $self->SUPER::get_token();
}
}
}
package AtteanX::Functions::CompositeLists 0.039 {
use Attean;
use Attean::RDF;
use Encode qw(decode_utf8);
use Scalar::Util qw(blessed);
use Digest::SHA qw(sha1_hex);
use AtteanX::Serializer::TurtleTokens;
use AtteanX::Parser::Turtle;
use AtteanX::SPARQL::Constants;
use AtteanX::Functions::CompositeMaps;
our $CDT_BASE = 'http://w3id.org/awslabs/neptune/SPARQL-CDTs/';
our $LIST_TYPE_IRI = "${CDT_BASE}List";
=item C<< lex_to_list($literal) >>
=cut
sub lex_to_list {
my $l = shift;
die 'TypeError: Cannot parse non-literal to cdt:List' unless ($l->does('Attean::API::Literal'));
my $dt = $l->datatype;
die 'TypeError: not a datatype literal' unless ($dt);
die 'TypeError: Expecting a List but found ' . $dt->value unless ($dt->value eq $LIST_TYPE_IRI);
my $lex = $l->value;
$lex =~ s/^\s*//g;
$lex =~ s/\s*$//g;
unless ($lex =~ m<^\[(.*)\]$>s) {
die 'TypeError: Invalid lexical form for cdt:List literal: ' . $dt->value;
}
open(my $fh, '<:encoding(UTF-8)', \$lex);
my $p = AtteanX::Parser::Turtle->new();
local($p->{enable_cdt_rewriting}) = 0;
my $lexer = AtteanX::Functions::CompositeLists::TurtleLexerWithNull->new(file => $fh);
my @nodes;
eval {
my $t = $p->_next_nonws($lexer);
if ($t->type == LBRACKET) {
push(@nodes, @{AtteanX::Functions::CompositeMaps::_recursive_lexer_parse_cdt($p, $lexer)});
}
# while (my $t = $p->_next_nonws($lexer)) {
#
# # warn "TOKEN: $t\n";
# if ($t and not blessed($t)) {
# # this is the special value returned from our lexer subclass that indicates a null values
# push(@nodes, undef);
# } else {
# next if ($t->type == COMMA);
# push(@nodes, $p->_object($lexer, $t));
# }
# }
};
( run in 1.274 second using v1.01-cache-2.11-cpan-6aa56a78535 )