Viikon pähkinä
Jarkko Hietaniemi
jhi at iki.fi
Thu Mar 18 03:20:22 CST 1999
Jarkko Hietaniemi writes:
>
> Testailen lisää: subscribe unsubscribe subscribe unsubscribe
No nyt ilmeisesti 'sub' peikko manattu pois. Majordomon oletus
asetus on tosiaan heittää kaikki (un)?subscribe-viesteiltä haiskahtava
listan administraattorille, onpas "hieno" piirre...
[takaisin aiheeseen "Viikon pähkinä"]
Eli: ei nyt aivan täsmälleen mitä haluttiin, mutta tässä olisi ihan
oikea jäsennin. Tarkalleen ottaen tämä muuntaa lausekkeen
foo and bar or zap or not goo
lausekkeeksi
/foo/ && /bar/ || /zap/ || ! /goo/
siinä sivussa tarkistaen myös lausekkeen oikeellisuuden.
sub literal ($);
sub emit ($;$);
sub expression ();
sub error ($);
sub parse ();
my $emit; # The output accumulator.
my $error; # The error message.
parse; # Do it.
exit 0; # Quit.
sub literal ($) {
my $lit = $_[0]; # The literal string to be consumed.
return s/^\s*\Q$lit\E\b\s*//;
}
sub emit ($;$) { # Consume input and (or just) emit output.
unless ( $error ) {
if ( @_ == 2 ) {
my ( $in, $out ) = ( literal( $_[0] ), $_[1] );
$emit .= $out if $in;
return $in;
} else {
$emit .= $_[0]; # Just $out.
}
}
}
sub expression () {
do {
do {
if ( literal '(' ) {
emit '( ';
expression;
error 'missing )' unless literal ')';
emit ' )';
} elsif ( literal 'not' ) {
error 'empty negation' if $_ eq '';
emit '! ';
expression;
} else {
if ( s/^\s*(\S+)\s*// || s/^\s*"(\S+?)"\s*// ) {
my $word = $1;
if ( $word =~ /^(not|and|or)$/ ) {
error "word '$word' cannot be a search word";
} else {
emit "/$word/i";
}
}
}
} while emit 'and', ' && ';
} while emit 'or', ' || ';
}
sub error ($) {
my $msg = $_[0];
$error = "$msg: $_" if $error eq '';
}
sub parse () {
while ( <STDIN> ) {
chomp;
$emit = $error = '';
expression;
error 'illegal input' if $_ ne '';
if ( $error eq '' ) {
print "$emit\n";
} else {
warn "parse error: $error\n";
}
}
}
(eräät saavat tämä jo kolmanteen kertaan :-)
--
$jhi++; # http://www.iki.fi/jhi/
# There is this special biologist word we use for 'stable'.
# It is 'dead'. -- Jack Cohen
More information about the Helsinki-pm
mailing list