|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexey Mahotkin 2:5020/400 15 Apr 2004 12:10:41 To : Sergey Ermakov Subject : Re: Парсинг "формулы" -------------------------------------------------------------------------------- >>>>> "SE" == Sergey Ermakov <Sergey.Ermakov@f3123.n5020.z2.fidonet.org> writes: SE> я Подскажите, чем можно пропарсить такую конструкцию?.. SE> (a + b) * (c + d) SE> Требуется получить: SE> a * c + a * d + b * c + b * d SE> ############################################### # Исключение скобок SE> sub rem_scope { my $d=shift; print ">>> $d:\n" if $debug; #if SE> ($d=~/\(.+\)/) my (%scopes,$i); while ($d=~/\(.+\)/) { $i++; my SE> ($s)=$d=~/\((.+?)\)/; my $x="X".$i; $scopes{$x}=$s; SE> $d=~s/\((.+?)\)/$x/; }; SE> foreach my $s (keys %scopes) { while($d=~/$s/) { print "$s ($d): " if SE> $debug; my @summ=split(/\s*\+\s*/,$scopes{$s}); my SE> ($before)=$d=~/([^\+]+?)$s/; my ($after)=$d=~/$s([^\+]+)/; SE> $d=~s/([^\+\(\)]*?)$s([^\+\(\)]*)/xx/; SE> foreach (@summ) { $_=$before.$_ if $before; $_.=$after if SE> $after; SE> } SE> my $rez=join(" + ",@summ); $d=~s/xx/$rez/; print " $before<- SE> ->$after | $rez = $d\n" if $debug; }; }; return($d); SE> } С таким стилем программирования ты далеко не уедешь. Попробуй сначала запрограммировать задачу на лиспе. Потом, когда станет понятно, перенеси на перл (ну или вызывай интерпретатор непосредственно). --alexm --- ifmail v.2.15dev5.3 * Origin: tyranny (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/38657f241156.html, оценка из 5, голосов 10
|