home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / pd7.lzh / SRC / gram.y < prev    next >
Text File  |  1990-05-06  |  11KB  |  400 lines

  1. /*    SC    A Spreadsheet Calculator
  2.  *        Command and expression parser
  3.  *
  4.  *        original by James Gosling, September 1982
  5.  *        modified by Mark Weiser and Bruce Israel,
  6.  *            University of Maryland
  7.  *
  8.  *         more mods Robert Bond 12/86
  9.  *
  10.  *        More mods by Alan Silverstein, 3/88, see list of changes.
  11.  *
  12.  *        $Revision: 6.1 $
  13.  */
  14.  
  15.  
  16.  
  17. %{
  18. #include <curses.h>
  19. #include "sc.h"
  20.  
  21. #define ENULL (struct enode *)0
  22.  
  23. char *strcpy();
  24. %}
  25.  
  26. %union {
  27.     int ival;
  28.     double fval;
  29.     struct ent_ptr ent;
  30.     struct enode *enode;
  31.     char *sval;
  32.     struct range_s rval;
  33. }
  34.  
  35. %type <ent> var
  36. %type <fval> num
  37. %type <rval> range
  38. %type <rval> var_or_range
  39. %type <sval> strarg
  40. %type <enode> e term expr_list
  41. %token <sval> STRING
  42. %token <ival> NUMBER
  43. %token <fval> FNUMBER
  44. %token <rval> RANGE
  45. %token <rval> VAR
  46. %token <sval> _WORD
  47. %token <ival> COL
  48. %token S_FORMAT
  49. %token S_LABEL
  50. %token S_LEFTSTRING
  51. %token S_RIGHTSTRING
  52. %token S_GET
  53. %token S_PUT
  54. %token S_MERGE
  55. %token S_LET
  56. %token S_WRITE
  57. %token S_TBL
  58. %token S_COPY
  59. %token S_SHOW
  60. %token S_ERASE
  61. %token S_FILL
  62. %token S_GOTO
  63. %token S_DEFINE
  64. %token S_UNDEFINE
  65. %token S_VALUE
  66. %token S_MDIR
  67. %token S_HIDE
  68. %token S_SET
  69.  
  70. %token K_FIXED
  71. %token K_SUM
  72. %token K_PROD
  73. %token K_AVG
  74. %token K_STDDEV
  75. %token K_ACOS
  76. %token K_ASIN
  77. %token K_ATAN
  78. %token K_ATAN2
  79. %token K_CEIL
  80. %token K_COS
  81. %token K_EXP
  82. %token K_FABS
  83. %token K_FLOOR
  84. %token K_HYPOT
  85. %token K_LN
  86. %token K_LOG
  87. %token K_PI
  88. %token K_POW
  89. %token K_SIN
  90. %token K_SQRT
  91. %token K_TAN
  92. %token K_DTR
  93. %token K_RTD
  94. %token K_MAX
  95. %token K_MIN
  96. %token K_RND
  97.  
  98. %token K_PV
  99. %token K_FV
  100. %token K_PMT
  101.  
  102. %token K_HOUR
  103. %token K_MINUTE
  104. %token K_SECOND
  105. %token K_MONTH
  106. %token K_DAY
  107. %token K_YEAR
  108. %token K_NOW
  109. %token K_DATE
  110. %token K_FMT
  111. %token K_SUBSTR
  112. %token K_STON
  113. %token K_EQS
  114. %token K_EXT
  115. %token K_NVAL
  116. %token K_SVAL
  117. %token K_LOOKUP
  118. %token K_INDEX
  119. %token K_STINDEX
  120. %token K_AUTO
  121. %token K_AUTOCALC
  122. %token K_BYROWS
  123. %token K_BYCOLS
  124. %token K_BYGRAPH
  125. %token K_ITERATIONS
  126. %token K_NUMERIC
  127. %token K_PRESCALE
  128. %token K_EXTFUN
  129. %token K_CELLCUR
  130. %token K_TOPROW
  131. %token K_TBLSTYLE
  132. %token K_TBL
  133. %token K_LATEX
  134. %token K_TEX
  135.  
  136. %left '?' ':'
  137. %left '|'
  138. %left '&'
  139. %nonassoc '<' '=' '>' '!'
  140. %left '+' '-' '#'
  141. %left '*' '/' '%'
  142. %left '^'
  143.  
  144. %%
  145. command:    S_LET var_or_range '=' e
  146.                 { let($2.left.vp, $4); }
  147.     |    S_LABEL var_or_range '=' e
  148.                 { slet($2.left.vp, $4, 0); }
  149.     |    S_LEFTSTRING var_or_range '=' e
  150.                 { slet($2.left.vp, $4, -1); }
  151.     |    S_RIGHTSTRING var_or_range '=' e
  152.                 { slet($2.left.vp, $4, 1); }
  153.     |    S_FORMAT COL ':' COL NUMBER NUMBER
  154.                 { doformat($2,$4,$5,$6); }
  155.     |    S_FORMAT COL NUMBER NUMBER
  156.                 { doformat($2,$2,$3,$4); }
  157.     |    S_GET strarg    {  /* This tmp hack is because readfile
  158.                     * recurses back through yyparse. */
  159.                   char *tmp;
  160.                   tmp = $2;
  161.                   readfile (tmp, 1);
  162.                   xfree(tmp);
  163.                 }
  164.     |    S_MERGE strarg    {
  165.                   char *tmp;
  166.                   tmp = $2;
  167.                   readfile (tmp, 0);
  168.                   xfree(tmp);
  169.                 }
  170.     |    S_MDIR strarg    
  171.                 { if (mdir) xfree(mdir); mdir = $2; }
  172.     |       S_PUT strarg range
  173.                 { (void) writefile($2, ($3.left.vp)->row, 
  174.                  ($3.left.vp)->col, ($3.right.vp)->row,
  175.                  ($3.right.vp)->col);
  176.                  xfree($2); }
  177.     |    S_PUT strarg    
  178.                 { (void) writefile ($2, 0, 0, maxrow, maxcol);
  179.                  xfree($2); }
  180.     |       S_WRITE strarg range { (void) printfile($2, ($3.left.vp)->row, 
  181.              ($3.left.vp)->col, ($3.right.vp)->row,
  182.              ($3.right.vp)->col);
  183.              xfree($2); }
  184.     |    S_WRITE strarg    { (void) printfile ($2, 0, 0, maxrow, maxcol);
  185.              xfree($2); }
  186.     |       S_TBL strarg range { (void) tblprintfile($2, ($3.left.vp)->row, 
  187.              ($3.left.vp)->col, ($3.right.vp)->row,
  188.              ($3.right.vp)->col);
  189.              xfree($2); }
  190.     |    S_TBL strarg    { (void)tblprintfile ($2, 0, 0, maxrow, maxcol);
  191.              xfree($2); }
  192.     |       S_SHOW COL ':' COL
  193.                     { showcol( $2, $4); }
  194.     |       S_SHOW NUMBER ':' NUMBER
  195.                     { showrow( $2, $4); }
  196.      |    S_HIDE COL
  197.                      { hide_col( $2 ); }
  198.      |    S_HIDE NUMBER
  199.                      { hide_row( $2 ); }
  200.     |    S_COPY range var_or_range 
  201.                     { copy($2.left.vp,$2.right.vp,
  202.                     $3.left.vp,$3.right.vp); }
  203.     |    S_ERASE       
  204.                     { eraser(lookat(showsr, showsc),
  205.                         lookat(currow, curcol)); }
  206.     |    S_ERASE var_or_range 
  207.                     { eraser($2.left.vp, $2.right.vp); }
  208.     |    S_VALUE       { valueize_area(showsr, showsc, currow, curcol);
  209.                  modflg++; }
  210.     |    S_VALUE var_or_range { valueize_area(($2.left.vp)->row,
  211.                 ($2.left.vp)->col,
  212.                 ($2.right.vp)->row,
  213.                 ($2.right.vp)->col); modflg++; }
  214.     |    S_FILL num num  { fill(lookat(showsr, showsc),
  215.                       lookat(currow, curcol), $2, $3); }
  216.     |    S_FILL var_or_range num num
  217.                  { fill($2.left.vp, $2.right.vp, $3, $4); }
  218.     |    S_GOTO var_or_range {moveto($2.left.vp->row, $2.left.vp->col);}
  219.     |       S_GOTO num          {num_search($2);}
  220.     |       S_GOTO STRING       {str_search($2);}
  221.     |    S_GOTO              {go_last();}
  222.     |    S_DEFINE strarg       { struct ent_ptr arg1, arg2;
  223.                     arg1.vp = lookat(showsr, showsc);
  224.                     arg1.vf = 0;
  225.                     arg2.vp = lookat(currow, curcol);
  226.                     arg2.vf = 0;
  227.                     add_range($2, arg1, arg2, 1); }
  228.  
  229.     |    S_DEFINE strarg range { add_range($2, $3.left, $3.right, 1); }
  230.     |    S_DEFINE strarg var   { add_range($2, $3, $3, 0); }
  231.     |    S_UNDEFINE var_or_range { del_range($2.left.vp, $2.right.vp); }
  232.      |    S_SET setlist
  233.     |    /* nothing */
  234.     |    error;
  235.  
  236. term:         var        { $$ = new_var('v', $1); }
  237.     |    K_FIXED term    { $$ = new ('f', ENULL, $2); }
  238.     |       '@' K_SUM '(' var_or_range ')' 
  239.                 { $$ = new_range(REDUCE | '+', $4); }
  240.     |       '@' K_PROD '(' var_or_range ')' 
  241.                 { $$ = new_range (REDUCE | '*', $4); }
  242.     |       '@' K_AVG '(' var_or_range ')' 
  243.                 { $$ = new_range (REDUCE | 'a', $4); }
  244.     |       '@' K_STDDEV '(' var_or_range ')' 
  245.                 { $$ = new_range (REDUCE | 's', $4); }
  246.     |       '@' K_MAX '(' var_or_range ')' 
  247.                 { $$ = new_range (REDUCE | MAX, $4); }
  248.     |    '@' K_MAX '(' e ',' expr_list ')'
  249.                 { $$ = new(LMAX, $6, $4); }
  250.     |       '@' K_MIN '(' var_or_range ')' 
  251.                 { $$ = new_range (REDUCE | MIN, $4); }
  252.     |    '@' K_MIN '(' e ',' expr_list ')'
  253.                 { $$ = new(LMIN, $6, $4); }
  254.     | '@' K_ACOS '(' e ')'
  255.             { $$ = new(ACOS, ENULL, $4); }
  256.     | '@' K_ASIN '(' e ')'     { $$ = new(ASIN, ENULL, $4); }
  257.     | '@' K_ATAN '(' e ')'     { $$ = new(ATAN, ENULL, $4); }
  258.     | '@' K_ATAN2 '(' e ',' e ')' { $$ = new(ATAN2, $4, $6); }
  259.     | '@' K_CEIL '(' e ')'     { $$ = new(CEIL, ENULL, $4); }
  260.     | '@' K_COS '(' e ')'     { $$ = new(COS, ENULL, $4); }
  261.     | '@' K_EXP '(' e ')'     { $$ = new(EXP, ENULL, $4); }
  262.     | '@' K_FABS '(' e ')'     { $$ = new(FABS, ENULL, $4); }
  263.     | '@' K_FLOOR '(' e ')'     { $$ = new(FLOOR, ENULL, $4); }
  264.     | '@' K_HYPOT '(' e ',' e ')'    { $$ = new(HYPOT, $4, $6); }
  265.     | '@' K_LN '(' e ')'     { $$ = new(LOG, ENULL, $4); }
  266.     | '@' K_LOG '(' e ')'     { $$ = new(LOG10, ENULL, $4); }
  267.     | '@' K_POW '(' e ',' e ')'    { $$ = new(POW, $4, $6); }
  268.     | '@' K_SIN '(' e ')'     { $$ = new(SIN, ENULL, $4); }
  269.     | '@' K_SQRT '(' e ')'     { $$ = new(SQRT, ENULL, $4); }
  270.     | '@' K_TAN '(' e ')'     { $$ = new(TAN, ENULL, $4); }
  271.     | '@' K_DTR '(' e ')'     { $$ = new(DTR, ENULL, $4); }
  272.     | '@' K_RTD '(' e ')'     { $$ = new(RTD, ENULL, $4); }
  273.     | '@' K_RND '(' e ')'     { $$ = new(RND, ENULL, $4); }
  274.  
  275.     | '@' K_PV  '(' e ',' e ',' e ')' { $$ = new(PV,  $4,new(':',$6,$8)); }
  276.      | '@' K_FV  '(' e ',' e ',' e ')' { $$ = new(FV,  $4,new(':',$6,$8)); }
  277.      | '@' K_PMT '(' e ',' e ',' e ')' { $$ = new(PMT, $4,new(':',$6,$8)); }
  278.  
  279.     | '@' K_HOUR '(' e ')'      { $$ = new(HOUR,ENULL, $4); }
  280.     | '@' K_MINUTE '(' e ')' { $$ = new(MINUTE,ENULL, $4); }
  281.     | '@' K_SECOND '(' e ')' { $$ = new(SECOND,ENULL, $4); }
  282.     | '@' K_MONTH '(' e ')'     { $$ = new(MONTH,ENULL,$4); }
  283.     | '@' K_DAY '(' e ')'    { $$ = new(DAY, ENULL, $4); }
  284.     | '@' K_YEAR '(' e ')'   { $$ = new(YEAR, ENULL, $4); }
  285.     | '@' K_NOW              { $$ = new(NOW, ENULL, ENULL);}
  286.     | '@' K_STON '(' e ')'   { $$ = new(STON, ENULL, $4); }
  287.     | '@' K_EQS '(' e ',' e ')' { $$ = new (EQS, $4, $6); }
  288.     | '@' K_DATE '(' e ')'     { $$ = new(DATE, ENULL, $4); }
  289.     | '@' K_FMT  '(' e ',' e ')' { $$ = new(FMT, $4, $6); }
  290.     | '@' K_INDEX  '(' e ',' var_or_range ')'
  291.          { $$ = new(INDEX, $4, new_range(REDUCE | INDEX, $6)); }
  292.     | '@' K_LOOKUP  '(' e ',' var_or_range ')'
  293.          { $$ = new(LOOKUP, $4, new_range(REDUCE | LOOKUP, $6)); }
  294.     | '@' K_STINDEX  '(' e ',' var_or_range ')'
  295.          { $$ = new(STINDEX, $4, new_range(REDUCE | STINDEX, $6)); }
  296.     | '@' K_EXT  '(' e ',' e ')' { $$ = new(EXT, $4, $6); }
  297.     | '@' K_NVAL '(' e ',' e ')' { $$ = new(NVAL, $4, $6); }
  298.     | '@' K_SVAL '(' e ',' e ')' { $$ = new(SVAL, $4, $6); }
  299.     | '@' K_SUBSTR '(' e ',' e ',' e ')'
  300.                  { $$ = new(SUBSTR, $4, new(',', $6, $8)); }
  301.     |    '(' e ')'     { $$ = $2; }
  302.     |    '+' term     { $$ = $2; }
  303.     |    '-' term     { $$ = new ('m', ENULL, $2); }
  304.     |    NUMBER         { $$ = new_const('k', (double) $1); }
  305.     |    FNUMBER         { $$ = new_const('k', $1); }
  306.     |    K_PI    { $$ = new_const('k', (double)3.14159265358979323846); }
  307.     |    STRING             { $$ = new_str($1); }
  308.     |    '~' term     { $$ = new ('~', ENULL, $2); }
  309.     |    '!' term     { $$ = new ('~', ENULL, $2); }
  310.     ;
  311.  
  312. e:        e '+' e        { $$ = new ('+', $1, $3); }
  313.     |    e '-' e        { $$ = new ('-', $1, $3); }
  314.     |    e '*' e        { $$ = new ('*', $1, $3); }
  315.     |    e '/' e        { $$ = new ('/', $1, $3); }
  316.     |    e '%' e        { $$ = new ('%', $1, $3); }
  317.     |    e '^' e        { $$ = new ('^', $1, $3); }
  318.     |    term
  319.     |    e '?' e ':' e    { $$ = new ('?', $1, new(':', $3, $5)); }
  320.     |    e '<' e        { $$ = new ('<', $1, $3); }
  321.     |    e '=' e        { $$ = new ('=', $1, $3); }
  322.     |    e '>' e        { $$ = new ('>', $1, $3); }
  323.     |    e '&' e        { $$ = new ('&', $1, $3); }
  324.     |    e '|' e        { $$ = new ('|', $1, $3); }
  325.     |    e '<' '=' e    { $$ = new ('~', ENULL, new ('>', $1, $4)); }
  326.     |    e '!' '=' e    { $$ = new ('~', ENULL, new ('=', $1, $4)); }
  327.     |    e '>' '=' e    { $$ = new ('~', ENULL, new ('<', $1, $4)); }
  328.     |    e '#' e        { $$ = new ('#', $1, $3); }
  329.     ;
  330.  
  331. expr_list:    e        { $$ = new(ELIST, ENULL, $1); }
  332.     |    expr_list ',' e    { $$ = new(ELIST, $1, $3); }
  333.     ;
  334.  
  335. range:        var ':' var    { $$.left = $1; $$.right = $3; }
  336.     |     RANGE        { $$ = $1; }
  337.     ;
  338.  
  339. var:        COL NUMBER    { $$.vp = lookat($2 , $1); $$.vf = 0;}
  340.     |    '$' COL NUMBER    { $$.vp = lookat($3 , $2);
  341.                     $$.vf = FIX_COL;}
  342.     |    COL '$' NUMBER    { $$.vp = lookat($3 , $1);
  343.                     $$.vf = FIX_ROW;}
  344.     |    '$' COL '$' NUMBER { $$.vp = lookat($4 , $2);
  345.                     $$.vf = FIX_ROW | FIX_COL;}
  346.     |    VAR        { $$ = $1.left; }
  347.     ;
  348.  
  349. var_or_range:    range        { $$ = $1; }
  350.     |    var        { $$.left = $1; $$.right = $1; }
  351.     ;
  352.  
  353. num:        NUMBER        { $$ = (double) $1; }
  354.     |    FNUMBER        { $$ = $1; }
  355.     |    '-' num        { $$ = -$2; }
  356.     |    '+' num        { $$ = $2; }
  357.     ;
  358.  
  359. strarg:        STRING        { $$ = $1; }
  360.     |    var        {
  361.                     char *s, *s1;
  362.                     s1 = $1.vp->label;
  363.                     if (!s1)
  364.                     s1 = "NULL_STRING";
  365.                     s = xmalloc((unsigned)strlen(s1)+1);
  366.                     (void) strcpy(s, s1);
  367.                     $$ = s;
  368.                 }
  369.       ;
  370.  
  371. setlist :    
  372.     |    setlist setitem
  373.     ;
  374.  
  375. setitem    :    K_AUTO        { setauto(1); }
  376.     |    K_AUTOCALC    { setauto(1); }
  377.     |    '~' K_AUTO    { setauto(0); }
  378.     |    '~' K_AUTOCALC    { setauto(0); }
  379.     |    '!' K_AUTO    { setauto(0); }
  380.     |    '!' K_AUTOCALC    { setauto(0); }
  381.     |    K_BYCOLS    { setorder(BYCOLS); }
  382.     |    K_BYROWS    { setorder(BYROWS); }
  383.     |    K_BYGRAPH    { setorder(BYGRAPH); }
  384.     |    K_NUMERIC    { numeric = 1; }
  385.     |    '!' K_NUMERIC    { numeric = 0; }
  386.     |    K_PRESCALE    { prescale = 0.01; }
  387.     |    '!' K_PRESCALE    { prescale = 1.0; }
  388.     |    K_EXTFUN    { extfunc = 1; }
  389.     |    '!' K_EXTFUN    { extfunc = 0; }
  390.     |    K_CELLCUR    { showcell = 1; }
  391.     |    '!' K_CELLCUR    { showcell = 0; }
  392.     |    K_TOPROW    { showtop = 1; }
  393.     |    '!' K_TOPROW    { showtop = 0; }
  394.     |    K_ITERATIONS '=' NUMBER    { setiterations($3); }
  395.     |    K_TBLSTYLE '=' NUMBER    { tbl_style = $3; }
  396.     |    K_TBLSTYLE '=' K_TBL    { tbl_style = TBL; }
  397.     |    K_TBLSTYLE '=' K_LATEX    { tbl_style = LATEX; }
  398.     |    K_TBLSTYLE '=' K_TEX    { tbl_style = TEX; }
  399.       ;
  400.