Thread Prefix-Terme berechnen
(19 answers)
Opened by Ronnie at 2005-06-05 01:10
schade, wurde doch mehr code als ich dachte:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #!/usr/bin/perl use strict; my $debug= 0; my $lisp= ""; # # S -> ( Op Opd* ) # Op -> + | * | - | / # Opd -> S | Number # my @tokens; my $pos= 0; sub lisp { print "lisp_eval [$pos] token [$tokens[$pos]]\n" if $debug; # throw away ( $pos ++; my $op= $tokens[$pos++]; my @operands= (); while( $pos < scalar( @tokens ) ) { last if( $tokens[$pos] eq ")" ); push @operands, operand(); } return [$op, @operands]; } sub operand { print "operand_eval [$pos] token [$tokens[$pos]]\n" if $debug; my $next= $tokens[$pos]; if( $next =~ m/\d+/ ) { $pos ++; return $next; } else { return lisp(); } } sub rewrite_perl { my @root= @{ shift() }; my $op= $root[0]; my @opds= (); foreach( 1 .. @root - 1 ) { if( ref $root[$_] eq "ARRAY" ) { push @opds, rewrite_perl( $root[$_] ); } else { push @opds, $root[$_]; } } my $code= $opds[0]; foreach( 1 .. @opds - 1 ) { $code= "( $code $op $opds[$_] )"; } return $code; } sub myread { $pos= 0; my $line= <STDIN>; @tokens= split /\s+/, $line; } LOOP: print eval ( rewrite_perl lisp( myread ) ), $/; goto LOOP; -- stefan
|