|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Sergey Ermakov 2:5020/3123 15 Apr 2004 00:30:26 To : All Subject : Парсинг "формулы" --------------------------------------------------------------------------------
Подскажите, чем можно пропарсить такую конструкцию?..
(a + b) * (c + d)
Требуется получить:
a * c + a * d + b * c + b * d
В общем случае может быть и такое:
a + b * (c + d) + (e + f) * g + h
Для b*(c+d) и (e+f)*g я парсинг написал, но вот для двух скобок...
Hо ведь есть и готовое?..
###############################################
# Исключение скобок
sub rem_scope
{
my $d=shift;
print ">>> $d:\n" if $debug;
#if ($d=~/\(.+\)/)
my (%scopes,$i);
while ($d=~/\(.+\)/)
{
$i++;
my ($s)=$d=~/\((.+?)\)/;
my $x="X".$i;
$scopes{$x}=$s;
$d=~s/\((.+?)\)/$x/;
};
foreach my $s (keys %scopes)
{
while($d=~/$s/)
{
print "$s ($d): " if $debug;
my @summ=split(/\s*\+\s*/,$scopes{$s});
my ($before)=$d=~/([^\+]+?)$s/;
my ($after)=$d=~/$s([^\+]+)/;
$d=~s/([^\+\(\)]*?)$s([^\+\(\)]*)/xx/;
foreach (@summ) {
$_=$before.$_ if $before;
$_.=$after if $after;
}
my $rez=join(" + ",@summ);
$d=~s/xx/$rez/;
print " $before<- ->$after | $rez = $d\n" if $debug;
};
};
return($d);
}
... trust no one.. [find my ICQ!] [ermakov@library.madi.ru]
--- pwrd_by GoldED/MMX ъ -=[ _Spa(eNeЕ_ ]=- ъ welcome to our society! ъ
* Origin: The dihydrogenmonooxydenation planet.. (2:5020/3123)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/2739407dad90.html, оценка из 5, голосов 10
|