/usr/share/doc/libparse-recdescent-perl/examples/demo_cpp.pl is in libparse-recdescent-perl 1.967013+dfsg-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 | #!/usr/bin/perl -sw
# RECURSIVE #includes DURING A RECURSIVE DESCENT
use Parse::RecDescent;
sub loadfile($)
{
open FILE, $_[0] or die "Couldn't find included file: $_[0]\n";
my $contents = <FILE>;
close FILE;
return $contents;
}
%macro = ();
sub demacro($)
{
my $text = shift;
while (($macro,$defn) = each %macro )
{
$text =~ s/$macro/$defn/;
}
return $text;
}
$grammar =
q{
file : line(s)
line : include
| macrodef
| linedir
{ $thisline = $item[1]; }
| codeline
{ print "found: [$item[1]] at $thisline\n" }
include : '#include' filename
{
print "pre: [$text] at $thisline\n";
$text = ::loadfile($item[-1]) . $text;
Parse::RecDescent::LineCounter::resync $thisline;
print "post: [$text] at $thisline\n";
}
filename : '"' m#[a-z0-9_./-]+#i '"'
{ $return = $item[-2] }
| '<' m#[a-z0-9_./-]+#i '>'
{ $return = $item[-2] }
macrodef : '#define' /[a-z]\w*/i /.*/
{ $::macro{$item[-2]} = $item[-1] }
linedir: '#line' /\d+/
codeline : /.*\n/
{ $return = ::demacro($item[-1]); }
};
$parse = new Parse::RecDescent ($grammar);
undef $/;
$reinput = $input = <>;
$parse->file($input) or die "Bad file! No biscuit!\n";
$parse->file($reinput) or die "Bad file! No biscuit!\n";
|