|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander Onokhov 2:5020/400 21 Apr 2004 15:15:18 To : Ivan Frolcov Subject : Re: Парсинг "формулы" -------------------------------------------------------------------------------- "Ivan Frolcov" <lala@mail.ge> writes: > Мне же, в свою очередь, внутренний голос говорит, что проще выписать > все возможные варианты и написать > несколько подстановок - что-то около 10. Да? А можно посмотреть на что это будет похоже? Hа Perl я могу сказать так: #----------------------------------- #!/usr/bin/perl -l use strict; use warnings; my $prn = qr{\((?:(?>[^()]+)|(??{$prn}))*\)}; my $tok = qr{(?:\w+|$prn)}; my $sgn = qr{[+-]}; sub tokenize { local $_ = shift; no warnings qw(uninitialized); if( /^($sgn)?($prn)$/ ) { my $s = $1 || '+'; my $t = $2; $t =~ s/^\((.*)\)$/$1/; return map { s/^(\+)?(?=[^+-])/-/ || s/^-/+/ if $s eq '-'; $_ } tokenize($t); } return /\(/ ? _tkz_mul($_) : $_ if /^[+-]?$tok(?:\*$tok)*$/; my @r; push @r, ($1 || '+') . $2 while m/\G($sgn)?($tok(?:\*$tok)*)/g; return map {tokenize( $_ )} @r; } sub _tkz_mul { local $_ = shift; my @r; my $sign = s/^([+-])// ? $1 : '+'; /^($tok)\*(.+)/; foreach my $a (tokenize($1)) { foreach my $b (tokenize($2)) { my ($sa, $va, $sb, $vb) = map {/^($sgn)?(.+)$/; (($1 || '+'), $2)} $a, $b; my $s = $sa eq $sb ? '+' : '-'; $s =~ tr/+-/-+/ if $sign eq '-'; push @r, "$s$va*$vb"; } } return @r; } sub foo { my $f = shift; $f =~ tr/ //d; my $res; for ($res = join ' ', map {split ''} tokenize($f)) { s/ \* /*/g; s/^\+ //; } return $res; } my $f = '1 - (1 + x*(a-b)*(a+b)))'; print for $f, foo($f); #----------------------------------- Комментарии не писал, чтоб человеку, сдающему зачет веселее было. Оно даже вложенные скобки понимает (с оговорками). Hе думаю, что калька с лисповского решения получится лучше. -- Alexander Onokhov --- ifmail v.2.15dev5.3 * Origin: What me? (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/1022908f33d03.html, оценка из 5, голосов 10
|