IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 4306


Ignore:
Timestamp:
Jun 17, 2005, 12:53:55 PM (21 years ago)
Author:
eugene
Message:

fixed up precedence

Location:
trunk/Ohana/src/opihi/lib.shell
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c

    r4305 r4306  
    2323    type = 0;
    2424    /* unary operations */
    25     if (!strcmp (argv[i], "abs"))    { type = 7; goto gotit; }
    26     if (!strcmp (argv[i], "int"))    { type = 7; goto gotit; }
    27     if (!strcmp (argv[i], "exp"))    { type = 7; goto gotit; }
    28     if (!strcmp (argv[i], "ten"))    { type = 7; goto gotit; }
    29     if (!strcmp (argv[i], "log"))    { type = 7; goto gotit; }
    30     if (!strcmp (argv[i], "ln"))     { type = 7; goto gotit; }
    31     if (!strcmp (argv[i], "sqrt"))   { type = 7; goto gotit; }
    32     if (!strcmp (argv[i], "erf"))    { type = 7; goto gotit; }
    33 
    34     if (!strcmp (argv[i], "sinh"))   { type = 7; goto gotit; }
    35     if (!strcmp (argv[i], "cosh"))   { type = 7; goto gotit; }
    36     if (!strcmp (argv[i], "asinh"))  { type = 7; goto gotit; }
    37     if (!strcmp (argv[i], "acosh"))  { type = 7; goto gotit; }
    38 
    39     if (!strcmp (argv[i], "sin"))    { type = 7; goto gotit; }
    40     if (!strcmp (argv[i], "cos"))    { type = 7; goto gotit; }
    41     if (!strcmp (argv[i], "tan"))    { type = 7; goto gotit; }
    42     if (!strcmp (argv[i], "dsin"))   { type = 7; goto gotit; }
    43     if (!strcmp (argv[i], "dcos"))   { type = 7; goto gotit; }
    44     if (!strcmp (argv[i], "dtan"))   { type = 7; goto gotit; }
    45     if (!strcmp (argv[i], "asin"))   { type = 7; goto gotit; }
    46     if (!strcmp (argv[i], "acos"))   { type = 7; goto gotit; }
    47     if (!strcmp (argv[i], "atan"))   { type = 7; goto gotit; }
    48     if (!strcmp (argv[i], "dasin"))  { type = 7; goto gotit; }
    49     if (!strcmp (argv[i], "dacos"))  { type = 7; goto gotit; }
    50     if (!strcmp (argv[i], "datan"))  { type = 7; goto gotit; }
    51 
    52     if (!strcmp (argv[i], "lgamma")) { type = 7; goto gotit; }
    53 
    54     if (!strcmp (argv[i], "rnd"))    { type = 7; goto gotit; }
    55     if (!strcmp (argv[i], "xramp"))  { type = 7; goto gotit; }
    56     if (!strcmp (argv[i], "yramp"))  { type = 7; goto gotit; }
    57     if (!strcmp (argv[i], "ramp"))   { type = 7; goto gotit; }
    58     if (!strcmp (argv[i], "zero"))   { type = 7; goto gotit; }
    59     if (!strcmp (argv[i], "--"))     { type = 7; goto gotit; }
    60     if (!strcmp (argv[i], "not"))    { type = 7; goto gotit; }
    61     if (!strcmp (argv[i], "isinf"))  { type = 7; goto gotit; }
    62     if (!strcmp (argv[i], "isnan"))  { type = 7; goto gotit; }
     25    if (!strcmp (argv[i], "abs"))    { type = 9; goto gotit; }
     26    if (!strcmp (argv[i], "int"))    { type = 9; goto gotit; }
     27    if (!strcmp (argv[i], "exp"))    { type = 9; goto gotit; }
     28    if (!strcmp (argv[i], "ten"))    { type = 9; goto gotit; }
     29    if (!strcmp (argv[i], "log"))    { type = 9; goto gotit; }
     30    if (!strcmp (argv[i], "ln"))     { type = 9; goto gotit; }
     31    if (!strcmp (argv[i], "sqrt"))   { type = 9; goto gotit; }
     32    if (!strcmp (argv[i], "erf"))    { type = 9; goto gotit; }
     33
     34    if (!strcmp (argv[i], "sinh"))   { type = 9; goto gotit; }
     35    if (!strcmp (argv[i], "cosh"))   { type = 9; goto gotit; }
     36    if (!strcmp (argv[i], "asinh"))  { type = 9; goto gotit; }
     37    if (!strcmp (argv[i], "acosh"))  { type = 9; goto gotit; }
     38
     39    if (!strcmp (argv[i], "sin"))    { type = 9; goto gotit; }
     40    if (!strcmp (argv[i], "cos"))    { type = 9; goto gotit; }
     41    if (!strcmp (argv[i], "tan"))    { type = 9; goto gotit; }
     42    if (!strcmp (argv[i], "dsin"))   { type = 9; goto gotit; }
     43    if (!strcmp (argv[i], "dcos"))   { type = 9; goto gotit; }
     44    if (!strcmp (argv[i], "dtan"))   { type = 9; goto gotit; }
     45    if (!strcmp (argv[i], "asin"))   { type = 9; goto gotit; }
     46    if (!strcmp (argv[i], "acos"))   { type = 9; goto gotit; }
     47    if (!strcmp (argv[i], "atan"))   { type = 9; goto gotit; }
     48    if (!strcmp (argv[i], "dasin"))  { type = 9; goto gotit; }
     49    if (!strcmp (argv[i], "dacos"))  { type = 9; goto gotit; }
     50    if (!strcmp (argv[i], "datan"))  { type = 9; goto gotit; }
     51
     52    if (!strcmp (argv[i], "lgamma")) { type = 9; goto gotit; }
     53
     54    if (!strcmp (argv[i], "rnd"))    { type = 9; goto gotit; }
     55    if (!strcmp (argv[i], "xramp"))  { type = 9; goto gotit; }
     56    if (!strcmp (argv[i], "yramp"))  { type = 9; goto gotit; }
     57    if (!strcmp (argv[i], "ramp"))   { type = 9; goto gotit; }
     58    if (!strcmp (argv[i], "zero"))   { type = 9; goto gotit; }
     59    if (!strcmp (argv[i], "--"))     { type = 9; goto gotit; }
     60    if (!strcmp (argv[i], "not"))    { type = 9; goto gotit; }
     61    if (!strcmp (argv[i], "isinf"))  { type = 9; goto gotit; }
     62    if (!strcmp (argv[i], "isnan"))  { type = 9; goto gotit; }
    6363
    6464    /* binary operations */
    65     if (!strcmp (argv[i], "^"))      { type = 6; goto gotit; }
    66 
    67     if (!strcmp (argv[i], "@"))      { type = 5; goto gotit; }
    68     if (!strcmp (argv[i], "/"))      { type = 5; goto gotit; }
    69     if (!strcmp (argv[i], "*"))      { type = 5; goto gotit; }
    70 
    71     if (!strcmp (argv[i], "+"))      { type = 4; goto gotit; }
    72     if (!strcmp (argv[i], "-"))      { type = 4; goto gotit; }
     65    if (!strcmp (argv[i], "^"))      { type = 8; goto gotit; }
     66
     67    if (!strcmp (argv[i], "@"))      { type = 7; goto gotit; }
     68    if (!strcmp (argv[i], "/"))      { type = 7; goto gotit; }
     69    if (!strcmp (argv[i], "*"))      { type = 7; goto gotit; }
     70
     71    if (!strcmp (argv[i], "+"))      { type = 6; goto gotit; }
     72    if (!strcmp (argv[i], "-"))      { type = 6; goto gotit; }
    7373       
    74     if (!strcmp (argv[i], "<"))      { type = 3; goto gotit; }
    75     if (!strcmp (argv[i], ">"))      { type = 3; goto gotit; }
     74    if (!strcmp (argv[i], "&"))      { type = 5; goto gotit; }
     75    if (!strcmp (argv[i], "|"))      { type = 5; goto gotit; }
     76
     77    if (!strcmp (argv[i], "<"))      { type = 4; goto gotit; }
     78    if (!strcmp (argv[i], ">"))      { type = 4; goto gotit; }
     79    if (!strcmp (argv[i], "=="))     { type = 4; strcpy (argv[i], "E"); goto gotit; }
     80    if (!strcmp (argv[i], "!="))     { type = 4; strcpy (argv[i], "N"); goto gotit; }
     81    if (!strcmp (argv[i], "<="))     { type = 4; strcpy (argv[i], "L"); goto gotit; }
     82    if (!strcmp (argv[i], ">="))     { type = 4; strcpy (argv[i], "G"); goto gotit; }
     83    if (!strcmp (argv[i], ">>"))     { type = 4; strcpy (argv[i], "U"); goto gotit; }
     84    if (!strcmp (argv[i], "<<"))     { type = 4; strcpy (argv[i], "D"); goto gotit; }
     85
    7686    if (!strcmp (argv[i], "&&"))     { type = 3; strcpy (argv[i], "A"); goto gotit; }
    7787    if (!strcmp (argv[i], "||"))     { type = 3; strcpy (argv[i], "O"); goto gotit; }
    78     if (!strcmp (argv[i], "=="))     { type = 3; strcpy (argv[i], "E"); goto gotit; }
    79     if (!strcmp (argv[i], "!="))     { type = 3; strcpy (argv[i], "N"); goto gotit; }
    80     if (!strcmp (argv[i], "<="))     { type = 3; strcpy (argv[i], "L"); goto gotit; }
    81     if (!strcmp (argv[i], ">="))     { type = 3; strcpy (argv[i], "G"); goto gotit; }
    82     if (!strcmp (argv[i], ">>"))     { type = 3; strcpy (argv[i], "U"); goto gotit; }
    83     if (!strcmp (argv[i], "<<"))     { type = 3; strcpy (argv[i], "D"); goto gotit; }
    84     if (!strcmp (argv[i], "&"))      { type = 3; goto gotit; }
    85     if (!strcmp (argv[i], "|"))      { type = 3; goto gotit; }
    8688
    8789    if (!strcmp (argv[i], "("))      { type = 2; goto gotit; }
     
    9193    /* choose how to deal with object */
    9294    switch (type) {
    93     case 6:  /* exponentiation */
    94       /* pop previous, higher operators from OP stack to stack */
    95       for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type > type); j--) {
    96         strcpy (stack[Nstack].name, op_stack[j].name);
    97         stack[Nstack].type = op_stack[j].type;
     95      case 8:  /* exponentiation: 2^2^3 = 64 != 256 (precedence is right-to-left, not left-to-right!) */
     96        /* pop previous, higher operators from OP stack to stack */
     97        for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type > type); j--) {
     98          strcpy (stack[Nstack].name, op_stack[j].name);
     99          stack[Nstack].type = op_stack[j].type;
     100          Nstack ++;
     101          Nop_stack --;
     102        }
     103        /* push operator on OP stack */
     104        strcpy (op_stack[Nop_stack].name, argv[i]);
     105        op_stack[Nop_stack].type = type;
     106        Nop_stack ++;
     107        break;
     108      case 9: /* unary OPs */
     109      case 7: /* binary OPs */
     110      case 6:
     111      case 5:
     112      case 4:
     113      case 3:
     114        /* pop previous, higher or equal operators from OP stack to stack */
     115        for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type >= type); j--) {
     116          strcpy (stack[Nstack].name, op_stack[j].name);
     117          stack[Nstack].type = op_stack[j].type;
     118          Nstack ++;
     119          Nop_stack --;
     120        }
     121        /* push operator on OP stack */
     122        strcpy (op_stack[Nop_stack].name, argv[i]);
     123        op_stack[Nop_stack].type = type;
     124        Nop_stack ++;
     125        break;
     126      case 2: 
     127        /* push operator on OP stack */
     128        strcpy (op_stack[Nop_stack].name, argv[i]);
     129        op_stack[Nop_stack].type = type;
     130        Nop_stack ++;
     131        break;
     132      case 1:
     133        /* pop rest of operators from OP stack to stack, looking for '(' */
     134        for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type != 2); j--) {
     135          strcpy (stack[Nstack].name, op_stack[j].name);
     136          stack[Nstack].type = op_stack[j].type;
     137          Nstack ++;
     138          Nop_stack --;
     139        }
     140        if ((j == -1) || (op_stack[j].type != 2)) {
     141          push_error ("syntax error: mismatched parenthesis");
     142          Nstack = 0;
     143          goto cleanup;
     144        }
     145        Nop_stack --;
     146        break;
     147      case 0:
     148        /* place the value (number or vector/matrix name) on stack */
     149        /* value of 'X' is used as sentinel until we sort out values */
     150        strcpy (stack[Nstack].name, argv[i]);
     151        stack[Nstack].type = 'X';
    98152        Nstack ++;
    99         Nop_stack --;
    100       }
    101       /* push operator on OP stack */
    102       strcpy (op_stack[Nop_stack].name, argv[i]);
    103       op_stack[Nop_stack].type = type;
    104       Nop_stack ++;
    105       break;
    106     case 7: /* unary OPs */
    107     case 5: /* binary OPs */
    108     case 4:
    109     case 3:
    110       /* pop previous, higher or equal operators from OP stack to stack */
    111       for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type >= type); j--) {
    112         strcpy (stack[Nstack].name, op_stack[j].name);
    113         stack[Nstack].type = op_stack[j].type;
    114         Nstack ++;
    115         Nop_stack --;
    116       }
    117       /* push operator on OP stack */
    118       strcpy (op_stack[Nop_stack].name, argv[i]);
    119       op_stack[Nop_stack].type = type;
    120       Nop_stack ++;
    121       break;
    122     case 2: 
    123       /* push operator on OP stack */
    124       strcpy (op_stack[Nop_stack].name, argv[i]);
    125       op_stack[Nop_stack].type = type;
    126       Nop_stack ++;
    127       break;
    128     case 1:
    129       /* pop rest of operators from OP stack to stack, looking for '(' */
    130       for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type != 2); j--) {
    131         strcpy (stack[Nstack].name, op_stack[j].name);
    132         stack[Nstack].type = op_stack[j].type;
    133         Nstack ++;
    134         Nop_stack --;
    135       }
    136       if ((j == -1) || (op_stack[j].type != 2)) {
    137         push_error ("syntax error: mismatched parenthesis");
    138         Nstack = 0;
    139         goto cleanup;
    140       }
    141       Nop_stack --;
    142       break;
    143     case 0:
    144       /* place the value (number or vector/matrix name) on stack */
    145       /* value of 'X' is used as sentinel until we sort out values */
    146       strcpy (stack[Nstack].name, argv[i]);
    147       stack[Nstack].type = 'X';
    148       Nstack ++;
    149       break;
     153        break;
    150154    }
    151155  }
     
    193197/* here are the rules for parsing a math AOL line to RPN:
    194198
    195    1) if object is a number, push on stack
    196    2) if object is a third order operand (exp, sin, cos), push on op stack
    197    3) if object is an open paren, push on op stack,
    198    4) if object is a second order operand, push on stack
    199    5) if object is a first order operand, pop all second order operands from stack
    200    until paren, push on stack
    201    6) if object is an end paren, pop all objects from stack until paren,
    202    pop next stack, if third order op
    203    7) if end of line, pop all remaining objects, second order first, etc.
     1991) if object is a number, push on stack
     2002) if object is a third order operand (exp, sin, cos), push on op stack
     2013) if object is an open paren, push on op stack,
     2024) if object is a second order operand, push on stack
     2035) if object is a first order operand, pop all second order operands from stack
     204until paren, push on stack
     2056) if object is an end paren, pop all objects from stack until paren,
     206pop next stack, if third order op
     2077) if end of line, pop all remaining objects, second order first, etc.
    204208   
    205209*/
  • trunk/Ohana/src/opihi/lib.shell/evaluate_stack.c

    r4305 r4306  
    11# include "opihi.h"
    22# define VERBOSE 0
     3
     4# define TWO_OP(A,B,FUNC) \
     5  if (!strncasecmp (&stack[i - 2].type, A, 1) && !strncasecmp (&stack[i - 1].type, B, 1)) \
     6    status = FUNC (&tmp_stack, &stack[i - 2], &stack[i - 1], stack[i].name);
     7
     8# define ONE_OP(A,FUNC) \
     9  if (!strncasecmp (&stack[i - 1].type, A, 1)) \
     10    status = FUNC (&tmp_stack, &stack[i - 1], stack[i].name);
    311
    412int evaluate_stack (StackVar *stack, int *Nstack) {
     
    4856
    4957    /***** binary operators *****/
    50     if ((stack[i].type == 3) || (stack[i].type == 4) || (stack[i].type == 5) || (stack[i].type == 6)) {
     58    if ((stack[i].type >= 3) && (stack[i].type <= 8)) {
    5159
    5260      if (i < 2) {  /* need two variables to operate on */
     
    5664        return (FALSE);
    5765      }
    58 
    59       /* this could be macro generated... */
    60       # define TWO_OP(A,B,FUNC) \
    61       if (!strncasecmp (&stack[i - 2].type, A, 1) && !strncasecmp (&stack[i - 1].type, B, 1)) \
    62         status = FUNC (&tmp_stack, &stack[i - 2], &stack[i - 1], stack[i].name);
    6366
    6467      TWO_OP ("M","M",MM_binary);
     
    9194
    9295    /***** unary operators **/
    93     if (stack[i].type == 7) {
     96    if (stack[i].type == 9) {
    9497
    9598      if (i < 1) {  /* need one variable to operate on */
     
    99102      }
    100103     
    101       if (!strncasecmp (&stack[i - 1].type, "M", 1))
    102         M_unary (&tmp_stack, &stack[i - 1], stack[i].name);
    103       if (!strncasecmp (&stack[i - 1].type, "V", 1))
    104         V_unary (&tmp_stack, &stack[i - 1], stack[i].name);
    105       if (!strncasecmp (&stack[i - 1].type, "S", 1))
    106         S_unary (&tmp_stack, &stack[i - 1], stack[i].name);
     104      ONE_OP ("M", M_unary);
     105      ONE_OP ("V", V_unary);
     106      ONE_OP ("S", S_unary);
    107107
    108108      /* there are no valid unary string operators */
Note: See TracChangeset for help on using the changeset viewer.