Server IP : 85.214.239.14 / Your IP : 18.118.128.17 Web Server : Apache/2.4.62 (Debian) System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.18 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /usr/share/doc/libparse-recdescent-perl/examples/ |
Upload File : |
#!/usr/bin/perl -ws # REMOVE COMMENTS FROM C++ CODE # ORIGINAL BY Helmut Jarausch # EXTENDED BY Damian Conway AND Helmut Jarausch AND Jeremy Braun use strict; use Parse::RecDescent; use vars qw/ $Grammar /; my $parser = new Parse::RecDescent $Grammar or die "invalid grammar"; undef $/; my $text = @ARGV ? <> : <DATA>; $parser->program($text) or die "malformed C program"; print "Comments\n========\n$parser->{comments}\n"; print "\nCode\n====\n$parser->{code}\n"; print "\nStrings\n=======\n", map(qq{\t"$_"\n}, @{$parser->{strings}}); BEGIN { $Grammar=<<'EOF'; program : <skip:''> { @{$thisparser}{qw(comments code strings)} = () } part(s) part : comment { $thisparser->{comments} .= $item[1]; $thisparser->{code} .= " "; } | C_code { $thisparser->{code} .= $item[1]; } | string { $thisparser->{code} .= qq("$item[1]"); push @{$thisparser->{strings}}, $item[1]; } | charlit { $thisparser->{code} .= qq('$item[1]'); push @{$thisparser->{strings}}, $item[1]; } C_code : m{( [^"/]+ # one or more non-delimiters ( # then (optionally)... / # a potential comment delimiter [^*/] # which is not an actual delimiter )? # )+ # all repeated once or more }x string : m{" # a leading delimiter (( # zero or more... \\. # escaped anything | # or [^"] # anything but a delimiter )* ) "}x { $return = $1 } charlit : m{' # a leading delimiter (( # zero or more... \\. # escaped anything | # or [^'] # anything but a delimiter )* ) '}x { $return = $1 } comment : m{\s* # optional whitespace // # comment delimiter [^\n]* # anything except a newline \n # then a newline }x | m{\s* # optional whitespace /\* # comment opener (?:[^*]+|\*(?!/))* # anything except */ \*/ # comment closer ([ \t]*)? # trailing blanks or tabs }x EOF } __DATA__ program test; // for decomment // using Parse::RecDescent int main() { /* this should be removed */ char *cp1 = ""; char *cp2 = "cp2"; char c3 = 'c'; int i; // a counter // remove this line altogehter int k; int more_indented; // keep indentation int l; /* a loop variable */ // should be completely removed char *str = "/* ceci n'est pas un commentaire */"; return 0; }