--- "bou, hou (GE Money, consultant)" <[EMAIL PROTECTED]> wrote:
> For Example
> a java file named AAA.java
> --------------------
> /* author : John Smith */
> // comment
> public class ClassA {
> /* */
> //comment
> public static void main(String[] args) {
> }
> ...
> }
> class ClassB {
> ...
> }
> ---------------------
> I want to get like this
> >perl ClassChecker.pl AAA.java
> >ClassA
> >ClassB
Ooh, I really shouldn't do this, but here's one way of doing it. It
takes comments and quoted strings into account. It could probably use
tweaking.
Wasn't sure why I had to diddle Regexp::Common like that. I couldn't
use both {quoted} and {comment} in the same program without that. I
probably misread the docs somewhere.
Cheers,
Ovid
#!/usr/bin/perl -l
use strict;
use warnings;
use HOP::Lexer 'string_lexer';
use Regexp::Common;
Regexp::Common->import('comment'); # ??? That was odd
my @files = @ARGV;
die "Usage: $0 files" unless @files;
sub ignore {()}
my @input_tokens = (
[ COMMENT => qr/$RE{comment}{Java}/, \&ignore ],
[ QUOTE => qr/$RE{quoted}/, \&ignore ],
[ CLASS => 'class' ],
[ INDENTIFIER => qr/\w+/ ],
[ ELSE => qr/.*/, \&ignore ],
);
foreach my $file (@files) {
open my $fh, '<', $file or die "Cannot open ($file) for
reading: $!";
my $text = do { local $/; <$fh> };
my $lexer = string_lexer( $text, @input_tokens );
while ( defined ( my $token = $lexer->() ) ) {
next unless ref $token;
if ( 'CLASS' eq $token->[0] ) {
my $next = $lexer->('peek');
print "$file: $next->[1]";
}
}
}
--
Buy the book -- http://www.oreilly.com/catalog/perlhks/
Perl and CGI -- http://users.easystreet.com/ovid/cgi_course/
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>