Diff for /loncom/xml/algebra/AlgParser.pm between versions 1.16 and 1.17

version 1.16, 2006/03/13 20:28:53 version 1.17, 2007/05/02 20:48:55
Line 39  $close{'('} = ')'; Line 39  $close{'('} = ')';
   
 my $binoper3 = '(?:\\^|\\*\\*)';  my $binoper3 = '(?:\\^|\\*\\*)';
 my $binoper2 = '[/*_,]';  my $binoper2 = '[/*_,]';
 my $binoper1 = '(?:<>|<=|>=|[-+=><%!])';  my $binoper1 = '(?:[-+%!])';
   my $binoper0 = '(?:<>|<=|>=|[=><])';
 my $openparen = '[{(\\[]';  my $openparen = '[{(\\[]';
 my $closeparen = '[})\\]]';  my $closeparen = '[})\\]]';
 my $varname = '[A-Za-z](?:_[0-9]+)?';  my $varname = '[A-Za-z](?:_[0-9]+)?';
Line 64  my $trigfname = '(?:(?:a(?:rc)?)?(?:sin| Line 65  my $trigfname = '(?:(?:a(?:rc)?)?(?:sin|
 my $otherfunc = '(?:exp|abs|logten|log|ln|sqrt|sgn|step|fact|int|lim|fun[a-zA-Z])';  my $otherfunc = '(?:exp|abs|logten|log|ln|sqrt|sgn|step|fact|int|lim|fun[a-zA-Z])';
 my $funcname = '(?:' . $otherfunc . '|' . $trigfname . ')';  my $funcname = '(?:' . $otherfunc . '|' . $trigfname . ')';
   
 my $tokenregexp = "(?:($binoper3)|($binoper2)|($binoper1)|($openparen)|" .  my $tokenregexp = "(?:($binoper3)|($binoper2)|($binoper1)|($binoper0)|($openparen)|" .
     "($closeparen)|($funcname)|($specialvalue)|($varname)|" .      "($closeparen)|($funcname)|($specialvalue)|($varname)|" .
     "($numberE)|($number))";      "($numberE)|($number))";
   
Line 77  sub nexttoken { Line 78  sub nexttoken {
  if (defined($1)) {return ['binop3',  $1];}   if (defined($1)) {return ['binop3',  $1];}
  if (defined($2)) {return ['binop2',  $2];}   if (defined($2)) {return ['binop2',  $2];}
  if (defined($3)) {return ['binop1',  $3];}   if (defined($3)) {return ['binop1',  $3];}
  if (defined($4)) {return ['openp',   $4];}   if (defined($4)) {return ['binop0',  $4];}
  if (defined($5)) {return ['closep',  $5];}   if (defined($5)) {return ['openp',   $5];}
  if (defined($6)) {return ['func1',   $6];}   if (defined($6)) {return ['closep',  $6];}
  if (defined($7)) {return ['special', $7];}   if (defined($7)) {return ['func1',   $7];}
  if (defined($8)) {return ['varname', $8];}   if (defined($8)) {return ['special', $8];}
  if (defined($9)) {return ['numberE', $9];}   if (defined($9)) {return ['varname', $9];}
  if (defined($10)) {return ['number', $10];}   if (defined($10)) {return ['numberE',$10];}
    if (defined($11)) {return ['number', $11];}
   }    }
   else {    else {
     push @{$self->{posarray}}, [$p1, undef];      push @{$self->{posarray}}, [$p1, undef];
Line 118  sub parse { Line 120  sub parse {
   local $_;    local $_;
   while ($currenttok) {    while ($currenttok) {
     $_ = $currenttok->[0];      $_ = $currenttok->[0];
     /binop1/ && do {      /binop[01]/ && do {
       # check if we have a binary or unary operation here.        # check if we have a binary or unary operation here.
       if (defined(${$currentref})) {        if (defined(${$currentref})) {
         # binary - walk up the tree until we hit an open paren or the top          # binary - walk up the tree until we hit an open paren or the top
Line 126  sub parse { Line 128  sub parse {
           $currentref = pop @backtrace;            $currentref = pop @backtrace;
         }          }
  my $index = ((${$currentref}->[0] eq 'top')?1:3);   my $index = ((${$currentref}->[0] eq 'top')?1:3);
         ${$currentref}->[$index] = ['binop1', $currenttok->[1],          ${$currentref}->[$index] = [$currenttok->[0], $currenttok->[1],
                                     ${$currentref}->[$index], undef];                                      ${$currentref}->[$index], undef];
         push @backtrace, $currentref;          push @backtrace, $currentref;
         push @backtrace, \${$currentref}->[$index];          push @backtrace, \${$currentref}->[$index];
         $currentref = \${$currentref}->[$index]->[3];          $currentref = \${$currentref}->[$index]->[3];
       } else {        } elsif (/binop1/) {
         # unary          # unary
         ${$currentref} = ['unop1', $currenttok->[1], undef];          ${$currentref} = ['unop1', $currenttok->[1], undef];
         push @backtrace, $currentref;          push @backtrace, $currentref;
         $currentref = \${$currentref}->[2];          $currentref = \${$currentref}->[2];
         } else {
     my ($mark) = pop(@{$self->{posarray}});
     my $position = 1+$mark->[0];
     return $self->error("Didn't expect " . $currenttok->[1] .
         " at position $position" , $mark);
       }        }
     };      };
     /binop2/ && do {      /binop2/ && do {
Line 485  sub tostring { Line 492  sub tostring {
   
   local $_;    local $_;
   $_ = $type;    $_ = $type;
   /binop1/ && do {    /binop[01]/ && do {
     my ($p1, $p2) = ('','');      my ($p1, $p2) = ('','');
     if ($args[2]->[0] eq 'binop1') {($p1,$p2)=qw{ ( ) };}      if ($args[2]->[0] eq 'binop1') {($p1,$p2)=qw{ ( ) };}
     return ($args[1]->tostring() . $args[0] . $p1 .      return ($args[1]->tostring() . $args[0] . $p1 .
Line 530  sub tolatex { Line 537  sub tolatex {
   
   local $_;    local $_;
   $_ = $type;    $_ = $type;
   /binop1/ && do {    /binop[01]/ && do {
     my ($p1, $p2) = ('','');      my ($p1, $p2) = ('','');
     if ($args[2]->[0] eq 'binop1') {($p1,$p2)=qw{ \left( \right) };}      if ($args[2]->[0] eq 'binop1') {($p1,$p2)=qw{ \left( \right) };}
     my $cmd=$args[0];      my $cmd=$args[0];

Removed from v.1.16  
changed lines
  Added in v.1.17


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>