Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Anatoly Moskovsky                    2:5020/400     19 Apr 2004  16:55:43
 To : Sergey Ermakov
 Subject : Re: Парсинг "формулы"
 -------------------------------------------------------------------------------- 
 
 Hi!
 *** Sergey Ermakov wrote:
 
  SE>  
  SE>      Подскажите, чем можно пропарсить такую конструкцию?..
  SE>      В общем случае может быть и такое:
  SE>      a + b * (c + d) + (e + f) * g + h
 
 ...
 
  SE>      Hо ведь есть и готовое?..
 
 Конечно есть. Используй генератор парсеров. Hапример Parse::Yapp.
 
 Вот пример тебе для затравки:
 #файл t.pl
 use strict;
 use MyParser;
 my $p = new MyParser;
 
 my $tree = $p->parse("a + b *(c + d) + (e + f) * g + h");
 
 $p->printpostfix($tree) if $tree;
 
 # файл MyParser.yp
 %{
 use strict;
 %}
 
 %token ID INT '(' ')'
 %left '+' '-'
 %left '*' '/'
 
 %start syntax
 
 %%
 syntax :
  expr
 ;
 
 expr:
   ID             { {TYPE => 'ID', VALUE => $_[1]} }
 | INT            { {TYPE => 'INT', VALUE => $_[1]} }
 | expr '+' expr  { {TYPE => 'BINOP', OP=>'+', L=> $_[1], R=>$_[3]}}
 | expr '-' expr  { {TYPE => 'BINOP', OP=>'-', L=> $_[1], R=>$_[3]}}
 | expr '*' expr  { {TYPE => 'BINOP', OP=>'*', L=> $_[1], R=>$_[3]}}
 | expr '/' expr  { {TYPE => 'BINOP', OP=>'/', L=> $_[1], R=>$_[3]}}
 | '(' expr ')'   { $_[2] }
 ;
  
 %%
 
 sub lexer {
  my ($me) = @_;
    for ($me->YYData->{INPUT}) {
     s/^\s+//s; #игнорируем пробелы  
 
       s/^(\d+)// 
          and return ('INT', $1);
       s/^([\w]+)// 
          and return ('ID', $1);
       s/^([+\-*\/\)\(])//
          and return ($1, $1);
       s/^(.)// 
          and return ('UNKNOWN', $1);
    }
    return ('', undef); #EOF
 }
 
 sub parse {
  my ($me, $syntax) = @_;
 
  $me->YYData->{INPUT} = $syntax;
 
  return $me->YYParse(yylex   => \&lexer, 
                      yydebug => 0 * (0x01|0x04));
 
 }
 
 sub printpostfix {
  my ($me, $tree) = @_;
  if ($tree->{TYPE} =~ /^ID|INT$/) {
   print $tree->{VALUE};
  }elsif ($tree->{TYPE} eq 'BINOP') {
 
   $me->printpostfix($tree->{L});
   $me->printpostfix($tree->{R});
 
   print $tree->{OP};
  }else {
   print "???";
  }
  print " ";
 }
 Bye
 
 --- ifmail v.2.15dev5.3
  * Origin: Alkar Teleport News Server (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Парсинг "формулы"   Sergey Ermakov   15 Apr 2004 00:30:26 
 Re: Парсинг "формулы"   Alexey Mahotkin   15 Apr 2004 12:10:41 
 Re: Парсинг "формулы"   Ivan Frolcov   15 Apr 2004 12:28:25 
 Re: Парсинг "формулы"   Artem Chuprina   15 Apr 2004 13:05:08 
 Re: Парсинг "формулы"   Alexey Mahotkin   16 Apr 2004 09:29:49 
 Re: Парсинг "формулы"   …. Љ®ў «м   19 Apr 2004 17:07:07 
 Re: Парсинг "формулы"   Artem Chuprina   19 Apr 2004 18:14:05 
 Re: Парсинг "формулы"   …. Љ®ў «м   19 Apr 2004 18:16:42 
 Re: Парсинг "формулы"   Artem Chuprina   19 Apr 2004 19:46:50 
 Re: Парсинг "формулы"   Ivan Frolkov   19 Apr 2004 21:55:43 
 Re: Парсинг "формулы"   Serge Chervjakov   19 Apr 2004 23:23:15 
 Re: Парсинг "формулы"   Alexey Mahotkin   19 Apr 2004 23:34:35 
 Re: Парсинг "формулы"   Ivan Frolcov   20 Apr 2004 11:56:14 
 Re: Парсинг "формулы"   Alexander Onokhov   21 Apr 2004 15:15:18 
 Re: Парсинг "формулы"   Ivan Frolcov   21 Apr 2004 16:15:02 
 Re: Парсинг "формулы"   …. Љ®ў «м   20 Apr 2004 09:23:25 
 Re: Парсинг "формулы"   Artem Chuprina   20 Apr 2004 12:10:46 
 Re: Парсинг "формулы"   …. Љ®ў «м   20 Apr 2004 12:37:56 
 Re: Парсинг "формулы"   Artem Chuprina   20 Apr 2004 16:31:02 
 Парсинг "формулы"   Kirill Joss   21 Apr 2004 19:54:08 
 Re: Парсинг "формулы"   Alexey Mahotkin   19 Apr 2004 23:34:35 
 Re: Парсинг "формулы"   Ivan Frolcov   20 Apr 2004 11:46:53 
 Re: Парсинг "формулы"   Alexey Mahotkin   15 Apr 2004 23:36:57 
 Re: Парсинг "формулы"   Ivan Frolcov   16 Apr 2004 11:19:29 
 Re: Парсинг "формулы"   Alexey Mahotkin   17 Apr 2004 00:20:28 
 Парсинг "формулы"   Sergey Ermakov   16 Apr 2004 19:09:24 
 Re: =?koi8-r?b?8MHS08nOxyAixs/SzdXM2SI=?=   Yuri Kostylev   21 Apr 2004 21:55:22 
 Парсинг "формулы"   Sergey Ermakov   16 Apr 2004 19:06:34 
 Re: Парсинг "формулы"   Alexey Mahotkin   17 Apr 2004 15:19:10 
 Re: =?koi8-r?b?8MHS08nOxyAixs/SzdXM2SI=?=   Yuri Kostylev   21 Apr 2004 22:08:17 
 Парсинг "формулы"   Bulat Ziganshin   15 Apr 2004 13:47:40 
 Парсинг "формулы"   Sergey Ermakov   16 Apr 2004 19:13:04 
 Re: Парсинг "формулы"   Andrei Protasovitski   17 Apr 2004 12:39:30 
 Парсинг "формулы"   Alexander Kostiuchenko   19 Apr 2004 02:12:51 
 Re: Парсинг "формулы"   Anatoly Moskovsky   19 Apr 2004 16:55:43 
Архивное /ru.perl/12829c49b6f6f.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional