# RDF::Query::Parser # ----------------------------------------------------------------------------- =head1 NAME RDF::Query::Parser - Parser base class =head1 VERSION This document describes RDF::Query::Parser version 2.919. =cut package RDF::Query::Parser; use strict; use warnings; no warnings 'redefine'; use RDF::Query::Node::Resource; use RDF::Query::Node::Literal; use RDF::Query::Node::Blank; use RDF::Query::Node::Variable; use RDF::Query::Algebra; use RDF::Query::Error qw(:try); use Data::Dumper; use Scalar::Util qw(blessed); use Carp qw(carp croak confess); ###################################################################### our ($VERSION); BEGIN { $VERSION = '2.919'; } ###################################################################### =head1 METHODS =over 4 =cut =item C Returns a new literal structure. =cut sub new_literal { my $self = shift; my $literal = shift; my $lang = shift; my $dt = shift; return RDF::Query::Node::Literal->new( $literal, $lang, $dt ); } =item C Returns a new variable structure. =cut sub new_variable { my $self = shift; my $name; if (@_) { $name = shift; } else { my $count = $self->{__PRIVATE_VARIABLE_COUNT}++; $name = '_____rdfquery_private_' . $count; } return RDF::Query::Node::Variable->new( $name ); } =item C Returns a new blank node structure. =cut sub new_blank { my $self = shift; my $id; if (@_) { $id = shift; } else { if (not defined($self->{blank_ids})) { $self->{blank_ids} = 1; } $id = 'a' . $self->{blank_ids}++; } return RDF::Query::Node::Blank->new( $id ); } =item C Returns a new variable structure. =cut sub new_uri { my $self = shift; my $uri = shift; return RDF::Query::Node::Resource->new( $uri ); } # =item C # # Returns a new QName URI structure. # # =cut # # sub new_qname { # my $self = shift; # my $prefix = shift; # my $name = shift; # return [ 'URI', [ $prefix, $name ] ]; # } # # =item C # # Returns a new UNION structure. # # =cut # # sub new_union { # my $self = shift; # my @patterns = @_; # return RDF::Query::Algebra::Union->new( @patterns ); # } # # =item C # # Returns a new OPTIONAL structure. # # =cut # # sub new_optional { # my $self = shift; # my $ggp = shift; # my $opt = shift; # return RDF::Query::Algebra::Optional->new( $ggp, $opt ); # } # # =item C # # Returns a new NAMED GRAPH structure. # # =cut # # sub new_named_graph { # my $self = shift; # my $graph = shift; # my $triples = shift; # return RDF::Query::Algebra::NamedGraph->new( $graph, $triples ); # } =item C Returns a new triple structure. =cut sub new_triple { my $self = shift; my ($s,$p,$o) = @_; return RDF::Query::Algebra::Triple->new( $s, $p, $o ); } =item C Returns a new unary expression structure. =cut sub new_unary_expression { my $self = shift; my $op = shift; my $operand = shift; return RDF::Query::Expression::Unary->new( $op, $operand ); } =item C Returns a new binary expression structure. =cut sub new_binary_expression { my $self = shift; my $op = shift; my @operands = @_[0,1]; return RDF::Query::Expression::Binary->new( $op, @operands ); } # =item C # # Returns a new n-ary expression structure. # # =cut # # sub new_nary_expression { # my $self = shift; # my $op = shift; # my @operands = @_; # return RDF::Query::Expression::Binary->new( $op, @operands ); # } # # =item C # # Returns a new logical expression structure. # # =cut # # sub new_logical_expression { # my $self = shift; # my $op = shift; # my @operands = @_; # die $op; # return RDF::Query::Expression->new( $op, @operands ); # } =item C Returns a new function expression structure. =cut sub new_function_expression { my $self = shift; my $function = shift; my @operands = @_; unless (blessed($function)) { $function = RDF::Query::Node::Resource->new( $function ); } return RDF::Query::Expression::Function->new( $function, @operands ); } =item C Returns a new alias expression structure. =cut sub new_alias_expression { my $self = shift; my $var = shift; my $expr = shift; return RDF::Query::Expression::Alias->new( 'alias', $var, $expr ); } =item C Returns a new filter structure. =cut sub new_filter { my $self = shift; my $expr = shift; my $pattern = shift; return RDF::Query::Algebra::Filter->new( $expr, $pattern ); } ###################################################################### =item C Sets the current error to C<$error>. If the parser is in commit mode (by calling C), throws a RDF::Query::Error::ParseError object. Otherwise returns C. =cut sub fail { my $self = shift; my $error = shift; my $l = Log::Log4perl->get_logger("rdf.query.parser"); no warnings 'uninitialized'; my $parsed = substr($self->{input}, 0, $self->{position}); my $line = ($parsed =~ tr/\n//) + 1; my ($lline) = $parsed =~ m/^(.*)\Z/mx; my $col = length($lline); my $rest = substr($self->{remaining}, 0, 10); $self->set_error( "Syntax error; $error at $line:$col (near '$rest')" ); if ($self->{commit}) { throw RDF::Query::Error::ParseError( -text => "$error at $line:$col (near '$rest')" ); } else { return undef; } } ###################################################################### =item C Returns the last error the parser experienced. =cut sub error { my $self = shift; if (defined $self->{error}) { return $self->{error}; } else { return ''; } } =begin private =item C Sets the object's error variable. =end private =cut sub set_error { my $self = shift; my $error = shift; $self->{error} = $error; } =begin private =item C Clears the object's error variable. =end private =cut sub clear_error { my $self = shift; $self->{error} = undef; } # =begin private # # =item C # # Sets the object's commit state. # # =end private # # =cut # # sub set_commit { # my $self = shift; # if (@_) { # $self->{commit} = shift; # } else { # $self->{commit} = 1; # } # } # # =begin private # # =item C # # Clears the object's commit state. # # =end private # # =cut # # sub unset_commit { # my $self = shift; # $self->{commit} = 0; # } # # =begin private # # =item C # # Returns the object's commit state. # # =end private # # =cut # # sub get_commit { # my $self = shift; # return $self->{commit}; # } 1; __END__ =back =head1 AUTHOR Gregory Williams =cut