/usr/share/perl5/CQL/Token.pm is in libcql-parser-perl 1.10-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | package CQL::Token;
use strict;
use warnings;
use base qw( Exporter );
=head1 NAME
CQL::Token - class for token objects returned by CQL::Lexer
=head1 SYNOPSIS
my $token = $lexer->nextToken();
if ( $token->type() == CQL_WORD ) {
print "the token is a word with value=", $token->string(), "\n";
}
=head1 DESCRIPTION
Ordinarily you won't really care about the tokens returned by the
CQL::Lexer since the lexer is used behind the scenes by CQL::Parser.
=head1 METHODS
=head2 new()
my $token = CQL::Token->new( '=' );
=cut
## CQL keyword types
use constant CQL_LT => 100; ## The "<" relation
use constant CQL_GT => 101; ## The ">" relation
use constant CQL_EQ => 102; ## The "=" relation
use constant CQL_LE => 103; ## The "<=" relation
use constant CQL_GE => 104; ## The ">=" relation
use constant CQL_NE => 105; ## The "<>" relation
use constant CQL_AND => 106; ## The "and" boolean
use constant CQL_OR => 107; ## The "or" boolean
use constant CQL_NOT => 108; ## The "not" boolean
use constant CQL_PROX => 109; ## The "prox" boolean
use constant CQL_ANY => 110; ## The "any" relation
use constant CQL_ALL => 111; ## The "all" relation
use constant CQL_EXACT => 112; ## The "exact" relation
use constant CQL_WITHIN => 113; ## The "within" relation
use constant CQL_ENCLOSES => 114; ## The "encloses" relation
use constant CQL_PARTIAL => 115; ## The "partial" relation
use constant CQL_PWORD => 116; ## The "word" proximity unit and the "word" relation modifier
use constant CQL_SENTENCE => 117; ## The "sentence" proximity unit
use constant CQL_PARAGRAPH => 118; ## The "paragraph" proximity unit
use constant CQL_ELEMENT => 119; ## The "element" proximity unit
use constant CQL_ORDERED => 120; ## The "ordered" proximity ordering
use constant CQL_UNORDERED => 121; ## The "unordered" proximity ordering
use constant CQL_RELEVANT => 122; ## The "relevant" relation modifier
use constant CQL_FUZZY => 123; ## The "fuzzy" relation modifier
use constant CQL_STEM => 124; ## The "stem" relation modifier
use constant CQL_SCR => 125; ## The server choice relation
use constant CQL_PHONETIC => 126; ## The "phonetic" relation modifier
use constant CQL_WORD => 127; ## A general word (not an operator)
use constant CQL_LPAREN => 128; ## A left paren
use constant CQL_RPAREN => 129; ## A right paren
use constant CQL_EOF => 130; ## End of query
use constant CQL_MODIFIER => 131; ## Start of modifier '/'
use constant CQL_STRING => 132; ## The "string" relation modifier
use constant CQL_ISODATE => 133; ## The "isoDate" relation modifier
use constant CQL_NUMBER => 134; ## The "number" relation modifier
use constant CQL_URI => 135; ## The "uri" relation modifier
use constant CQL_MASKED => 137; ## The "masked" relation modifier
use constant CQL_UNMASKED => 138; ## The "unmasked" relation modifier
use constant CQL_NWSE => 139; ## The "nwse" relation modifier
use constant CQL_DISTANCE => 140; ## The "distance" proximity modifier
use constant CQL_UNIT => 141; ## The "unit" proximity modifier
## lookup table for easily determining token type
our %lookupTable = (
'<' => CQL_LT,
'>' => CQL_GT,
'=' => CQL_EQ,
'<=' => CQL_LE,
'>=' => CQL_GE,
'<>' => CQL_NE,
'and' => CQL_AND,
'or' => CQL_OR,
'not' => CQL_NOT,
'prox' => CQL_PROX,
'any' => CQL_ANY,
'within' => CQL_WITHIN,
'encloses' => CQL_ENCLOSES,
'partial' => CQL_PARTIAL,
'all' => CQL_ALL,
'exact' => CQL_EXACT,
'word' => CQL_PWORD,
'sentence' => CQL_SENTENCE,
'paragraph' => CQL_PARAGRAPH,
'element' => CQL_ELEMENT,
'ordered' => CQL_ORDERED,
'unordered' => CQL_UNORDERED,
'relevant' => CQL_RELEVANT,
'fuzzy' => CQL_FUZZY,
'stem' => CQL_STEM,
'phonetic' => CQL_PHONETIC,
'(' => CQL_LPAREN,
')' => CQL_RPAREN,
'/' => CQL_MODIFIER,
'' => CQL_EOF,
'string' => CQL_STRING,
'isodate' => CQL_ISODATE,
'number' => CQL_NUMBER,
'uri' => CQL_URI,
'masked' => CQL_MASKED,
'unmasked' => CQL_UNMASKED,
'nwse' => CQL_NWSE,
'distance' => CQL_DISTANCE,
'unit' => CQL_UNIT,
);
## constants available for folks to use when looking at
## token types
our @EXPORT = qw(
CQL_LT CQL_GT CQL_EQ CQL_LE CQL_GE CQL_NE CQL_AND CQL_OR CQL_NOT
CQL_PROX CQL_ANY CQL_ALL CQL_EXACT CQL_PWORD CQL_SENTENCE CQL_PARAGRAPH
CQL_ELEMENT CQL_ORDERED CQL_UNORDERED CQL_RELEVANT CQL_FUZZY
CQL_STEM CQL_SCR CQL_PHONETIC CQL_RPAREN CQL_LPAREN
CQL_WORD CQL_PHRASE CQL_EOF CQL_MODIFIER CQL_STRING CQL_ISODATE
CQL_NUMBER CQL_URI CQL_MASKED CQL_UNMASKED CQL_WITHIN CQL_PARTIAL
CQL_ENCLOSES CQL_NWSE
CQL_DISTANCE CQL_UNIT
);
=head2 new()
=cut
sub new {
my ($class,$string) = @_;
my $type;
# see if it's a reserved word, which are case insensitive
my $normalString = lc($string);
if ( exists($lookupTable{$normalString}) ) {
$type = $lookupTable{$normalString};
}
else {
$type = CQL_WORD;
# remove outer quotes if present
if ($string =~ m/^"(.*)"$/g) {
$string = $1;
# replace escaped double quote with double quote.
# Is save this way cause the string is assumed to be syntactically correct
$string =~ s/\\"/"/g;
}
}
return bless { string=>$string, type=>$type }, ref($class) || $class;
}
=head2 getType()
Returns the token type which will be available as one of the constants
that CQL::Token exports. See internals for a list of available constants.
=cut
sub getType { return shift->{type}; }
=head2 getString()
Retruns the string equivalent of the token. Particularly useful when
you only know it's a CQL_WORD.
=cut
sub getString { return shift->{string}; }
1;
|