CORBA-IDL
view release on metacpan or search on metacpan
lib/CORBA/IDL/Lexer.pm view on Meta::CPAN
s/^\*//
and $flag = 1,
last;
}
s/^([ \t\f\013]+)//
and $parser->YYData->{doc} .= $1,
last;
s/^(.[\w \t]*)//
and $parser->YYData->{doc} .= $1,
$flag = 1,
last;
}
}
}
sub _DocAfterLexer {
my ($parser) = @_;
unless (defined $parser->YYData->{curr_node}) {
$parser->_DocLexer();
return;
}
unless (exists $parser->YYData->{curr_node}->{doc}) {
$parser->YYData->{curr_node}->{doc} = q{};
}
my $flag = 1;
while (1) {
$parser->YYData->{line}
or $parser->YYData->{line} = readline $parser->YYData->{fh}
or return;
for ($parser->YYData->{line}) {
s/^(\n)//
and $parser->YYData->{lineno} ++,
$parser->YYData->{curr_node}->{doc} .= $1,
$flag = 0,
last;
s/^\r//
and last;
s/^\*\///
and return;
unless ($flag) {
s/^\*//
and $flag = 1,
last;
}
s/^([ \t\f\013]+)//
and $parser->YYData->{curr_node}->{doc} .= $1,
last;
s/^(.[\w \t]*)//
and $parser->YYData->{curr_node}->{doc} .= $1,
$flag = 1,
last;
}
}
}
sub _CodeLexer {
my ($parser) = @_;
my $frag = q{};
while (1) {
$parser->YYData->{line}
or $parser->YYData->{line} = readline $parser->YYData->{fh}
or return;
for ($parser->YYData->{line}) {
s/^(\n)//
and $parser->YYData->{lineno} ++,
$frag .= $1,
last;
s/^%\}.*//
and return ('CODE_FRAGMENT', $frag);
s/^(.[^%\n]*)//
and $frag .= $1,
last;
}
}
}
sub _PragmaLexer { # 10.6.5 Pragma Directives for RepositoryId
my ($parser, $line) = @_;
for ($line) {
s/^ID[ \t]+([0-9A-Za-z_:]+)[ \t]+\"([^\s">]+)\"//
and $parser->YYData->{symbtab}->PragmaID($1,$2),
return;
s/^prefix[ \t]+\"([0-9A-Za-z_:\.\/\-]*)\"//
and $parser->YYData->{symbtab}->PragmaPrefix($1),
return;
s/^version[ \t]+([0-9A-Za-z_:]+)[ \t]+([0-9]+)\.([0-9]+)//
and $parser->YYData->{symbtab}->PragmaVersion($1,$2,$3),
return;
$parser->Info("Non standard pragma.\n");
return;
}
}
sub _AttachDoc {
my ($parser, $comment) = @_;
if (defined $parser->YYData->{curr_node}) {
if (exists $parser->YYData->{curr_node}->{doc}) {
$parser->YYData->{curr_node}->{doc} .= $comment;
}
else {
$parser->YYData->{curr_node}->{doc} = $comment;
}
}
}
sub Lexer {
my ($parser) = @_;
while (1) {
$parser->YYData->{line}
or $parser->YYData->{line} = readline $parser->YYData->{fh}
or return (q{}, undef);
unless (exists $parser->YYData->{srcname}) {
if ($parser->YYData->{line} =~ /^#\s*(line\s+)?\d+\s+["<]([^\s">]+)[">]\s*\n/ ) {
$parser->YYData->{srcname} = $2;
}
else {
print "INTERNAL_ERROR:_Lexer\n";
}
if (defined $parser->YYData->{srcname}) {
my @st = stat($parser->YYData->{srcname});
$parser->YYData->{srcname_size} = $st[7];
$parser->YYData->{srcname_mtime} = $st[9];
}
}
for ($parser->YYData->{line}) {
s/^#\s+[\d]+\s+"<[^>]+>"\s*\d*\s*\n// # cpp 3.2.3 ("<build-in>", "<command line> [\d]")
and last;
s/^#\s+([\d]+)\s+["<]([^\s">]+)[">]\s+([\d]+)\s*\n// # cpp
and $parser->YYData->{lineno} = $1,
$parser->YYData->{filename} = $2,
$parser->YYData->{doc} = q{},
$parser->YYData->{curr_node} = undef,
last;
s/^#\s+([\d]+)\s+["<]([^\s">]+)[">]\s*\n// # cpp
and $parser->YYData->{lineno} = $1,
$parser->YYData->{filename} = $2,
$parser->YYData->{doc} = q{},
$parser->YYData->{curr_node} = undef,
last;
s/^#\s*line\s+([\d]+)\s+["<]([^\s">]+)[">]\s*\n// # CL.EXE Microsoft VC
and $parser->YYData->{lineno} = $1,
$parser->YYData->{filename} = $2,
$parser->YYData->{doc} = q{},
$parser->YYData->{curr_node} = undef,
last;
s/^[ \r\t\f\013]+//; # whitespaces
s/^\n//
and $parser->YYData->{lineno} ++,
$parser->YYData->{curr_node} = undef,
last;
s/^#pragma\s+(.*)\n//
and _PragmaLexer($parser, $1),
$parser->YYData->{lineno} ++,
$parser->YYData->{curr_node} = undef,
last;
s/^\/\*\*<// # documentation after
and _DocAfterLexer($parser),
last;
s/^\/\*\*// # documentation
and _DocLexer($parser),
last;
s/^\/\/\/(.*)\n// # single line documentation
and _AttachDoc($parser, $1),
and $parser->YYData->{lineno} ++,
last;
s/^\/\*// # multiple line comment
and _CommentLexer($parser),
last;
s/^\/\/.*\n// # single line comment
and $parser->YYData->{lineno} ++,
$parser->YYData->{curr_node} = undef,
last;
s/^%\{// # code fragment
and return _CodeLexer($parser);
if ($parser->YYData->{prop}) {
s/^([A-Za-z][0-9A-Za-z_]*)//
and return ('PROP_KEY', $1);
s/^\(([^\)]+)\)//
and return ('PROP_VALUE', $1);
}
if ($parser->YYData->{native}) {
s/^([^\)]+)\)//
and return ('NATIVE_TYPE', $1);
}
s/^__declspec\s*\(\s*([A-Za-z]*)\s*\)//
and return ('DECLSPEC', $1);
s/^([0-9]+)([Dd])//
and $parser->YYData->{lexeme} = $1 . $2,
return ('FIXED_PT_LITERAL', new Math::BigFloat($1));
s/^([0-9]+\.)([Dd])//
and $parser->YYData->{lexeme} = $1 . $2,
return ('FIXED_PT_LITERAL', new Math::BigFloat($1));
s/^(\.[0-9]+)([Dd])//
and $parser->YYData->{lexeme} = $1 . $2,
return ('FIXED_PT_LITERAL', new Math::BigFloat($1));
s/^([0-9]+\.[0-9]+)([Dd])//
and $parser->YYData->{lexeme} = $1 . $2,
return ('FIXED_PT_LITERAL', new Math::BigFloat($1));
s/^([0-9]+\.[0-9]+[Ee][+\-]?[0-9]+)//
and $parser->YYData->{lexeme} = $1,
return ('FLOATING_PT_LITERAL', new Math::BigFloat($1));
s/^([0-9]+[Ee][+\-]?[0-9]+)//
and $parser->YYData->{lexeme} = $1,
return ('FLOATING_PT_LITERAL', new Math::BigFloat($1));
s/^(\.[0-9]+[Ee][+\-]?[0-9]+)//
and $parser->YYData->{lexeme} = $1,
return ('FLOATING_PT_LITERAL', new Math::BigFloat($1));
s/^([0-9]+\.[0-9]+)//
and $parser->YYData->{lexeme} = $1,
return ('FLOATING_PT_LITERAL', new Math::BigFloat($1));
s/^([0-9]+\.)//
and $parser->YYData->{lexeme} = $1,
return ('FLOATING_PT_LITERAL', new Math::BigFloat($1));
s/^(\.[0-9]+)//
and $parser->YYData->{lexeme} = $1,
return ('FLOATING_PT_LITERAL', new Math::BigFloat($1));
s/^0([0-7]+)//
and $parser->YYData->{lexeme} = '0' . $1,
return _OctInteger($parser, $1);
s/^(0[Xx])([A-Fa-f0-9]+)//
and $parser->YYData->{lexeme} = $1 . $2,
return _HexInteger($parser, $2);
s/^(0)//
and $parser->YYData->{lexeme} = $1,
return ('INTEGER_LITERAL', new Math::BigInt($1));
s/^([1-9][0-9]*)//
( run in 0.838 second using v1.01-cache-2.11-cpan-b16cb0d3907 )