www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Beispielprogramm

mini-lexer.pl
#!/usr/local/bin/perl -w
# mini-lexer.pl -- Simuliert eine Teilmenge des lex(1)

use Getopt::Std;
use vars qw ($opt_v);
getopts("v") || die "usage: $0 [-v] lexfile [lex-input ...]\n";

$lexfile = shift;
open(LEX, $lexfile) or die "can't open lexfile $lexfile: $!\n";
while (<LEX>) {
    chomp;
    if ($_ eq '%%') {
    # Nach %% folgt sich die main()-Funktion...
    $exec_code = join('', <LEX>);
    last;
    } else {
    # Normale Trennung: regexp <tab> perlcode; perl; perl;...
    ($regexp, $pcode) = split(/\t+/);
    $regexp =~ s!/!\\/!g;
    push(@regs, $regexp); push(@codes, $pcode);
    }
}
close(LEX);

if (@regs) {
    $dyncode = "while(1) {\n";
    $dyncode .= "    if (/\\G($regs[0])/gc) {\n";
    $dyncode .= "        $codes[0];\n";
    $dyncode .= "    } ";
}

shift @regs; shift @codes;
foreach $reg (@regs) {
    $dyncode .= "elsif (/\\G($reg)/gc) {\n";
    $dyncode .= "       " . shift(@codes) . "\n";
    $dyncode .= "    } ";
}

if ($dyncode) {
    $dyncode .= " else {\n";
    $dyncode .= "     last;\n";
    $dyncode .= " }\n";
    $dyncode .= "}\n";
}

print STDERR $dyncode if defined $opt_v;
print STDERR "%%\n", $exec_code if defined $opt_v;

$_ = join('', <>);
eval $dyncode;
eval $exec_code if defined $exec_code;
   

[Prev] [Up] [Relevant Chapter] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:56:00 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo