Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
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 |
|