home *** CD-ROM | disk | FTP | other *** search
/ pc.louisiana.edu/pub/unix/ / Louisiana_UNIX.tar / Louisiana_UNIX / xspread3.0.zoo / gram.y < prev    next >
Text File  |  1994-03-25  |  16KB  |  541 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.21 $
  13.  */
  14.  
  15.  
  16.  
  17. %{
  18. #ifdef DOINGX
  19. #include <stdio.h>
  20. #include <X11/Xlib.h>
  21. #include <X11/Xutil.h>
  22. #else
  23. #include <curses.h>
  24. #endif
  25.  
  26. #ifdef IEEE_MATH
  27. # include <ieeefp.h>
  28. #endif /* IEEE_MATH */
  29.  
  30. #include <math.h>
  31. #include "sc.h"
  32.  
  33. #ifndef PI
  34. #define PI (double)3.14159265358979323846
  35. #endif
  36.  
  37. #define ENULL (struct enode *)0
  38. %}
  39.  
  40. %union {
  41.     int ival;
  42.     double fval;
  43.     struct ent_ptr ent;
  44.     struct enode *enode;
  45.     char *sval;
  46.     struct range_s rval;
  47. }
  48.  
  49. %type <ent> var
  50. %type <fval> num
  51. %type <rval> range
  52. %type <rval> var_or_range
  53. %type <sval> strarg
  54. %type <enode> e term expr_list
  55. %token <sval> STRING
  56. %token <ival> NUMBER
  57. %token <fval> FNUMBER
  58. %token <rval> RANGE
  59. %token <rval> VAR
  60. %token <sval> WORD
  61. %token <ival> COL
  62. %token S_FORMAT
  63. %token S_FMT
  64. %token S_LABEL
  65. %token S_LEFTSTRING
  66. %token S_RIGHTSTRING
  67. %token S_GET
  68. %token S_PUT
  69. %token S_MERGE
  70. %token S_LET
  71. %token S_WRITE
  72. %token S_TBL
  73. %token S_COPY
  74. %token S_SHOW
  75. %token S_ERASE
  76. %token S_FILL
  77. %token S_LOCK
  78. %token S_UNLOCK
  79. %token S_GOTO
  80. %token S_DEFINE
  81. %token S_UNDEFINE
  82. %token S_VALUE
  83. %token S_MDIR
  84. %token S_HIDE
  85. %token S_SET
  86.  
  87. %token K_ERROR
  88. %token K_INVALID
  89. %token K_FIXED
  90. %token K_SUM
  91. %token K_PROD
  92. %token K_AVG
  93. %token K_STDDEV
  94. %token K_COUNT
  95. %token K_ABS
  96. %token K_ACOS
  97. %token K_ASIN
  98. %token K_ATAN
  99. %token K_ATAN2
  100. %token K_CEIL
  101. %token K_COS
  102. %token K_EXP
  103. %token K_FABS
  104. %token K_FLOOR
  105. %token K_HYPOT
  106. %token K_LN
  107. %token K_LOG
  108. %token K_PI
  109. %token K_POW
  110. %token K_SIN
  111. %token K_SQRT
  112. %token K_TAN
  113. %token K_DTR
  114. %token K_RTD
  115. %token K_MAX
  116. %token K_MIN
  117. %token K_RND
  118. %token K_ROUND
  119. %token K_IF
  120.  
  121. %token K_PV
  122. %token K_FV
  123. %token K_PMT
  124.  
  125. %token K_HOUR
  126. %token K_MINUTE
  127. %token K_SECOND
  128. %token K_MONTH
  129. %token K_DAY
  130. %token K_YEAR
  131. %token K_NOW
  132. %token K_DATE
  133. %token K_DTS
  134. %token K_TTS
  135. %token K_FMT
  136. %token K_SUBSTR
  137. %token K_UPPER
  138. %token K_LOWER
  139. %token K_CAPITAL
  140. %token K_STON
  141. %token K_EQS
  142. %token K_EXT
  143. %token K_NVAL
  144. %token K_SVAL
  145. %token K_LOOKUP
  146. %token K_HLOOKUP
  147. %token K_VLOOKUP
  148. %token K_INDEX
  149. %token K_STINDEX
  150. %token K_AUTO
  151. %token K_AUTOCALC
  152. %token K_BYROWS
  153. %token K_BYCOLS
  154. %token K_ITERATIONS
  155. %token K_NUMERIC
  156. %token K_PRESCALE
  157. %token K_EXTFUN
  158. %token K_CELLCUR
  159. %token K_TOPROW
  160. %token K_TBLSTYLE
  161. %token K_TBL
  162. %token K_LATEX
  163. %token K_SLATEX
  164. %token K_TEX
  165. %token K_FRAME
  166. %token K_RNDINFINITY
  167. %token K_MYROW
  168. %token K_MYCOL
  169. %token K_COLTOA
  170. %token K_CRACTION
  171. %token K_CRROW
  172. %token K_CRCOL
  173. %token K_ROWLIMIT
  174. %token K_COLLIMIT
  175. %token K_NUMITER
  176. %token K_MATRIX_ADD
  177. %token K_MATRIX_SUB
  178. %token K_MATRIX_INV
  179. %token K_MATRIX_MULT
  180. %token K_MATRIX_TRANS
  181. %token K_GRAPH
  182.   
  183. %left '?' ':'
  184. %left '|'
  185. %left '&'
  186. %nonassoc '<' '=' '>' '!'
  187. %left '+' '-' '#'
  188. %left '*' '/' '%'
  189. %left '^'
  190.  
  191. %%
  192. /* commands */
  193. command:    S_LET var_or_range '=' e
  194.                 { let($2.left.vp, $4); }
  195.     |    S_LABEL var_or_range '=' e
  196.                 { slet($2.left.vp, $4, 0); }
  197.     |    S_LEFTSTRING var_or_range '=' e
  198.                 { slet($2.left.vp, $4, -1); }
  199.     |    S_RIGHTSTRING var_or_range '=' e
  200.                 { slet($2.left.vp, $4, 1); }
  201.     |    S_FORMAT COL ':' COL NUMBER NUMBER NUMBER
  202.                 { doformat($2,$4,$5,$6,$7); }
  203.     |    S_FORMAT COL NUMBER NUMBER NUMBER
  204.                 { doformat($2,$2,$3,$4,$5); }
  205.         |       S_FORMAT COL ':' COL NUMBER NUMBER
  206.                                 { doformat($2,$4,$5,$6, REFMTFIX); }
  207.         |       S_FORMAT COL NUMBER NUMBER
  208.                                 { doformat($2,$2,$3,$4, REFMTFIX); }
  209.     |    S_GET strarg    {  /* This tmp hack is because readfile
  210.                     * recurses back through yyparse. */
  211.                   char *tmp;
  212.                   tmp = $2;
  213.                   readfile (tmp, 1);
  214.                   scxfree(tmp);
  215.                 }
  216.     |    S_MERGE strarg    {
  217.                   char *tmp;
  218.                   tmp = $2;
  219.                   readfile (tmp, 0);
  220.                   scxfree(tmp);
  221.                 }
  222.     |    S_MDIR strarg    
  223.                 { if (mdir) scxfree(mdir); mdir = $2; }
  224.     |       S_PUT strarg range
  225.                 { (void) writefile($2, ($3.left.vp)->row, 
  226.                  ($3.left.vp)->col, ($3.right.vp)->row,
  227.                  ($3.right.vp)->col);
  228.                  scxfree($2); }
  229.     |    S_PUT strarg    
  230.                 { (void) writefile ($2, 0, 0, maxrow, maxcol);
  231.                  scxfree($2); }
  232.     |       S_WRITE strarg range { (void) printfile($2, ($3.left.vp)->row, 
  233.              ($3.left.vp)->col, ($3.right.vp)->row,
  234.              ($3.right.vp)->col);
  235.              scxfree($2); }
  236.     |    S_WRITE strarg    { (void) printfile ($2, 0, 0, maxrow, maxcol);
  237.              scxfree($2); }
  238.     |       S_TBL strarg range { (void) tblprintfile($2, ($3.left.vp)->row, 
  239.              ($3.left.vp)->col, ($3.right.vp)->row,
  240.              ($3.right.vp)->col);
  241.              scxfree($2); }
  242.     |    S_TBL strarg    { (void)tblprintfile ($2, 0, 0, maxrow, maxcol);
  243.              scxfree($2); }
  244.     |       S_SHOW COL ':' COL
  245.                     { showcol( $2, $4); }
  246.     |       S_SHOW NUMBER ':' NUMBER
  247.                     { showrow( $2, $4); }
  248.      |    S_HIDE COL
  249.                      { hide_col( $2 ); }
  250.      |    S_HIDE NUMBER
  251.                      { hide_row( $2 ); }
  252.     |    S_COPY range var_or_range 
  253.                     { copy($2.left.vp,$2.right.vp,
  254.                     $3.left.vp,$3.right.vp); }
  255.     |    S_ERASE       
  256.                     { eraser(lookat(showsr, showsc),
  257.                         lookat(currow, curcol)); }
  258.     |    S_ERASE var_or_range 
  259.                     { eraser($2.left.vp, $2.right.vp); }
  260.     |    S_VALUE       { valueize_area(showsr, showsc, currow, curcol);
  261.                  modflg++; }
  262.     |    S_VALUE var_or_range { valueize_area(($2.left.vp)->row,
  263.                     ($2.left.vp)->col,
  264.                     ($2.right.vp)->row,
  265.                     ($2.right.vp)->col); modflg++; }
  266.     |    S_FILL num num  { fill(lookat(showsr, showsc),
  267.                       lookat(currow, curcol), $2, $3); }
  268.     |    S_FILL var_or_range num num
  269.                 { fill($2.left.vp, $2.right.vp, $3, $4); }
  270.     |    S_FMT var_or_range STRING
  271.                 { format_cell($2.left.vp, $2.right.vp, $3); }
  272.     |    S_LOCK       
  273.                     { lock_cells(lookat(showsr, showsc),
  274.                         lookat(currow, curcol)); }
  275.     |    S_LOCK var_or_range
  276.                 { lock_cells($2.left.vp, $2.right.vp); }
  277.     |    S_UNLOCK       
  278.                     { unlock_cells(lookat(showsr, showsc),
  279.                         lookat(currow, curcol)); }
  280.     |    S_UNLOCK var_or_range
  281.                 { unlock_cells($2.left.vp, $2.right.vp); }
  282.     |    S_GOTO var_or_range {moveto($2.left.vp->row, $2.left.vp->col);}
  283.     |       S_GOTO num        { num_search($2, 0); }
  284.     |       S_GOTO errlist
  285.     |       S_GOTO STRING        { str_search($2); }
  286.     |    S_GOTO            { go_last(); }
  287.     |    S_DEFINE strarg       { struct ent_ptr arg1, arg2;
  288.                     arg1.vp = lookat(showsr, showsc);
  289.                     arg1.vf = 0;
  290.                     arg2.vp = lookat(currow, curcol);
  291.                     arg2.vf = 0;
  292.                                         if (arg1.vp == arg2.vp)
  293.                                            add_range($2, arg2, arg2, 0);
  294.                                         else
  295.                                            add_range($2, arg1, arg2, 1); }
  296.  
  297.     |    S_DEFINE strarg range    { add_range($2, $3.left, $3.right, 1); }
  298.     |    S_DEFINE strarg var    { add_range($2, $3, $3, 0); }
  299.     |    S_UNDEFINE var_or_range    { del_range($2.left.vp, $2.right.vp); }
  300.      |    S_SET setlist
  301.     |    /* nothing */
  302.     |    error;
  303.  
  304. /* terminals: functions, cells, string variables */
  305. term:         var            { $$ = new_var(O_VAR, $1); }
  306.     |    K_FIXED term        { $$ = new ('f', ENULL, $2); }
  307.     |       '@' K_SUM '(' var_or_range ')' 
  308.                 { $$ = new_range(REDUCE | '+', $4); }
  309.     |       '@' K_PROD '(' var_or_range ')' 
  310.                 { $$ = new_range (REDUCE | '*', $4); }
  311.     |       '@' K_AVG '(' var_or_range ')' 
  312.                 { $$ = new_range (REDUCE | 'a', $4); }
  313.     |       '@' K_STDDEV '(' var_or_range ')' 
  314.                 { $$ = new_range (REDUCE | 's', $4); }
  315.     |       '@' K_COUNT '(' var_or_range ')' 
  316.                 { $$ = new_range (REDUCE | 'c', $4); }
  317.     |       '@' K_MAX '(' var_or_range ')' 
  318.                 { $$ = new_range (REDUCE | MAXR, $4); }
  319.     |    '@' K_MAX '(' e ',' expr_list ')'
  320.                 { $$ = new(LMAX, $6, $4); }
  321.     |       '@' K_MIN '(' var_or_range ')' 
  322.                 { $$ = new_range (REDUCE | MINR, $4); }
  323.     |    '@' K_MIN '(' e ',' expr_list ')'
  324.                 { $$ = new(LMIN, $6, $4); }
  325.     | '@' K_ABS '(' e ')'        { $$ = new(ABS, ENULL, $4); }
  326.     | '@' K_ACOS '(' e ')'        { $$ = new(ACOS, ENULL, $4); }
  327.     | '@' K_ASIN '(' e ')'        { $$ = new(ASIN, ENULL, $4); }
  328.     | '@' K_ATAN '(' e ')'        { $$ = new(ATAN, ENULL, $4); }
  329.     | '@' K_ATAN2 '(' e ',' e ')'    { $$ = new(ATAN2, $4, $6); }
  330.     | '@' K_CEIL '(' e ')'        { $$ = new(CEIL, ENULL, $4); }
  331.     | '@' K_COS '(' e ')'        { $$ = new(COS, ENULL, $4); }
  332.     | '@' K_EXP '(' e ')'        { $$ = new(EXP, ENULL, $4); }
  333.     | '@' K_FABS '(' e ')'        { $$ = new(FABS, ENULL, $4); }
  334.     | '@' K_FLOOR '(' e ')'        { $$ = new(FLOOR, ENULL, $4); }
  335.     | '@' K_HYPOT '(' e ',' e ')'    { $$ = new(HYPOT, $4, $6); }
  336.     | '@' K_LN '(' e ')'        { $$ = new(LOG, ENULL, $4); }
  337.     | '@' K_LOG '(' e ')'        { $$ = new(LOG10, ENULL, $4); }
  338.     | '@' K_POW '(' e ',' e ')'    { $$ = new(POW, $4, $6); }
  339.     | '@' K_SIN '(' e ')'        { $$ = new(SIN, ENULL, $4); }
  340.     | '@' K_SQRT '(' e ')'        { $$ = new(SQRT, ENULL, $4); }
  341.     | '@' K_TAN '(' e ')'        { $$ = new(TAN, ENULL, $4); }
  342.     | '@' K_DTR '(' e ')'        { $$ = new(DTR, ENULL, $4); }
  343.     | '@' K_RTD '(' e ')'        { $$ = new(RTD, ENULL, $4); }
  344.     | '@' K_RND '(' e ')'        { $$ = new(RND, ENULL, $4); }
  345.     | '@' K_ROUND '(' e ',' e ')'    { $$ = new(ROUND, $4, $6); }
  346.     | '@' K_IF  '(' e ',' e ',' e ')' { $$ = new(IF,  $4,new(',',$6,$8)); }
  347.  
  348.     | '@' K_PV  '(' e ',' e ',' e ')' { $$ = new(PV,  $4,new(':',$6,$8)); }
  349.      | '@' K_FV  '(' e ',' e ',' e ')' { $$ = new(FV,  $4,new(':',$6,$8)); }
  350.      | '@' K_PMT '(' e ',' e ',' e ')' { $$ = new(PMT, $4,new(':',$6,$8)); }
  351.  
  352.     | '@' K_HOUR '(' e ')'        { $$ = new(HOUR,ENULL, $4); }
  353.     | '@' K_MINUTE '(' e ')'    { $$ = new(MINUTE,ENULL, $4); }
  354.     | '@' K_SECOND '(' e ')'    { $$ = new(SECOND,ENULL, $4); }
  355.     | '@' K_MONTH '(' e ')'        { $$ = new(MONTH,ENULL,$4); }
  356.     | '@' K_DAY '(' e ')'        { $$ = new(DAY, ENULL, $4); }
  357.     | '@' K_YEAR '(' e ')'        { $$ = new(YEAR, ENULL, $4); }
  358.     | '@' K_NOW            { $$ = new(NOW, ENULL, ENULL);}
  359.     | '@' K_DTS '(' e ',' e ',' e ')'
  360.                     { $$ = new(DTS, $4, new(',', $6, $8));}
  361.     | '@' K_TTS '(' e ',' e ',' e ')'
  362.                     { $$ = new(TTS, $4, new(',', $6, $8));}
  363.     | '@' K_STON '(' e ')'        { $$ = new(STON, ENULL, $4); }
  364.     | '@' K_EQS '(' e ',' e ')'    { $$ = new (EQS, $4, $6); }
  365.     | '@' K_DATE '(' e ')'        { $$ = new(DATE, ENULL, $4); }
  366.     | '@' K_FMT  '(' e ',' e ')'    { $$ = new(FMT, $4, $6); }
  367.     | '@' K_UPPER '(' e ')'        { $$ = new(UPPER, ENULL, $4); }
  368.     | '@' K_LOWER '(' e ')'        { $$ = new(LOWER, ENULL, $4); }
  369.     | '@' K_CAPITAL '(' e ')'    { $$ = new(CAPITAL, ENULL, $4); }
  370.     | '@' K_INDEX  '(' e ',' var_or_range ')'
  371.          { $$ = new(INDEX, $4, new_range(REDUCE | INDEX, $6)); }
  372.     | '@' K_LOOKUP  '(' e ',' var_or_range ')'
  373.          { $$ = new(LOOKUP, $4, new_range(REDUCE | LOOKUP, $6)); }
  374.     | '@' K_HLOOKUP  '(' e ',' var_or_range ',' e ')'
  375.          { $$ = new(HLOOKUP, new(',', $4, $8),
  376.             new_range((REDUCE | HLOOKUP), $6)); }
  377.     | '@' K_VLOOKUP  '(' e ',' var_or_range ',' e ')'
  378.          { $$ = new(VLOOKUP, new(',', $4, $8),
  379.             new_range((REDUCE | VLOOKUP), $6)); }
  380.     | '@' K_STINDEX  '(' e ',' var_or_range ')'
  381.          { $$ = new(STINDEX, $4, new_range((REDUCE | STINDEX), $6)); }
  382.     | '@' K_EXT  '(' e ',' e ')'    { $$ = new(EXT, $4, $6); }
  383.     | '@' K_NVAL '(' e ',' e ')'    { $$ = new(NVAL, $4, $6); }
  384.     | '@' K_SVAL '(' e ',' e ')'    { $$ = new(SVAL, $4, $6); }
  385.     | '@' K_SUBSTR '(' e ',' e ',' e ')'
  386.                 { $$ = new(SUBSTR, $4, new(',', $6, $8)); }
  387.     |    '(' e ')'    { $$ = $2; }
  388.     |    '+' term    { $$ = $2; }
  389.     |    '-' term    { $$ = new ('m', ENULL, $2); }
  390.     |    NUMBER        { $$ = new_const(O_CONST, (double) $1); }
  391.     |    FNUMBER        { $$ = new_const(O_CONST, $1); }
  392.     |    NUMBER '_' NUMBER '_' NUMBER
  393.         {
  394.             int y = $5;
  395.  
  396.             /* Convert 'NN' to years since 1970.
  397.              * (or 2000, fix by 2070)
  398.              */
  399.             if (y < 100) {        /* Full year not given */
  400.                 if (y >= 70)    /* 70-99 == Years since 1900 */
  401.                     y += 1900;
  402.                 else        /* 00-69 == Years since 2000 */
  403.                     y += 2000;
  404.             }
  405.             $$ = new_const(O_CONST, dodts($1, $3, y));
  406.         }
  407.     |    K_PI { $$ = new_const(O_CONST, PI); }
  408.     | '@'   K_PI { $$ = new_const(O_CONST, PI); }
  409.     |    STRING            { $$ = new_str($1); }
  410.     |    '~' term    { $$ = new ('~', ENULL, $2); }
  411.     |    '!' term    { $$ = new ('~', ENULL, $2); }
  412.     | '@' K_MYROW            { $$ = new(MYROW, ENULL, ENULL);}
  413.     | '@' K_MYCOL            { $$ = new(MYCOL, ENULL, ENULL);}
  414.     | '@' K_COLTOA '(' e ')'    { $$ = new(COLTOA, ENULL, $4);}
  415.     | '@' K_NUMITER            { $$ = new(NUMITER, ENULL, ENULL);}
  416.  
  417.     /* Matrix stuff */
  418.     | '@' K_MATRIX_ADD '(' var_or_range ',' var_or_range ',' var_or_range ')'
  419. /*            { $$ = new_range(MATRIX_ADD, $4, new_range(':', $6, $8)); }*/
  420.             {}
  421.     | '@' K_MATRIX_SUB '(' var_or_range ',' var_or_range ',' var_or_range ')'
  422. /*            { $$ = new_range(MATRIX_SUB, $4, new_range(':', $6, $8)); }*/
  423.             {}
  424.     | '@' K_MATRIX_INV '(' var_or_range ',' var_or_range ')'
  425. /*            { $$ = new_range(MATRIX_INV, $4, $6 ); }*/
  426.             {}
  427.     | '@' K_MATRIX_MULT '(' var_or_range ',' var_or_range ',' var_or_range ')'
  428. /*            { $$ = new_range(MATRIX_MULT, $4, new_range(':', $6, $8)); }*/
  429.             {}
  430.     | '@' K_MATRIX_TRANS '(' var_or_range ',' var_or_range ')'
  431. /*            { $$ = new_range(MATRIX_TRANS, $4, $6 ); }*/
  432.             {}
  433.     ;
  434.  
  435. /* expressions */
  436. e:        e '+' e        { $$ = new ('+', $1, $3); }
  437.     |    e '-' e        { $$ = new ('-', $1, $3); }
  438.     |    e '*' e        { $$ = new ('*', $1, $3); }
  439.     |    e '/' e        { $$ = new ('/', $1, $3); }
  440.     |    e '%' e        { $$ = new ('%', $1, $3); }
  441.     |    e '^' e        { $$ = new ('^', $1, $3); }
  442.     |    term
  443.     |    e '?' e ':' e    { $$ = new ('?', $1, new(':', $3, $5)); }
  444.     |    e '<' e        { $$ = new ('<', $1, $3); }
  445.     |    e '=' e        { $$ = new ('=', $1, $3); }
  446.     |    e '>' e        { $$ = new ('>', $1, $3); }
  447.     |    e '&' e        { $$ = new ('&', $1, $3); }
  448.     |    e '|' e        { $$ = new ('|', $1, $3); }
  449.     |    e '<' '=' e    { $$ = new ('~', ENULL, new ('>', $1, $4)); }
  450.     |    e '!' '=' e    { $$ = new ('~', ENULL, new ('=', $1, $4)); }
  451.     |    e '<' '>' e    { $$ = new ('~', ENULL, new ('=', $1, $4)); }
  452.     |    e '>' '=' e    { $$ = new ('~', ENULL, new ('<', $1, $4)); }
  453.     |    e '#' e        { $$ = new ('#', $1, $3); }
  454.     ;
  455.  
  456. /* list of expressions */
  457. expr_list:    e        { $$ = new(ELIST, ENULL, $1); }
  458.     |    expr_list ',' e    { $$ = new(ELIST, $1, $3); }
  459.     ;
  460.  
  461. range:        var ':' var    { $$.left = $1; $$.right = $3; }
  462.     |     RANGE        { $$ = $1; }
  463.     ;
  464.  
  465. var:        COL NUMBER    { $$.vp = lookat($2 , $1); $$.vf = 0; }
  466.     |    '$' COL NUMBER    { $$.vp = lookat($3 , $2);
  467.                     $$.vf = FIX_COL; }
  468.     |    COL '$' NUMBER    { $$.vp = lookat($3 , $1);
  469.                     $$.vf = FIX_ROW; }
  470.     |    '$' COL '$' NUMBER { $$.vp = lookat($4 , $2);
  471.                     $$.vf = FIX_ROW | FIX_COL; }
  472.     |    VAR        { $$ = $1.left; }
  473.     ;
  474.  
  475. var_or_range:    range        { $$ = $1; }
  476.     |    var        { $$.left = $1; $$.right = $1; }
  477.     ;
  478.  
  479. /* a number */
  480. num:        NUMBER        { $$ = (double) $1; }
  481.     |    FNUMBER        { $$ = $1; }
  482.     |    '-' num        { $$ = -$2; }
  483.     |    '+' num        { $$ = $2; }
  484.     ;
  485.  
  486. /* a string argument */
  487. strarg:        STRING        { $$ = $1; }
  488.     |    var        {
  489.                     char *s, *s1;
  490.                     s1 = $1.vp->label;
  491.                     if (!s1)
  492.                     s1 = "NULL_STRING";
  493.                     s = scxmalloc((unsigned)(strlen(s1)+1));
  494.                     (void) strcpy(s, s1);
  495.                     $$ = s;
  496.                 }
  497.       ;
  498.  
  499. /* allows >=1 'setitem's to be listed in the same 'set' command */
  500. setlist :
  501.     |    setlist    setitem
  502.     ;
  503.  
  504. /* things that you can 'set' */
  505. setitem    :    K_AUTO        { setauto(1); }
  506.     |    K_AUTOCALC    { setauto(1); }
  507.     |    '~' K_AUTO    { setauto(0); }
  508.     |    '~' K_AUTOCALC    { setauto(0); }
  509.     |    '!' K_AUTO    { setauto(0); }
  510.     |    '!' K_AUTOCALC    { setauto(0); }
  511.     |    K_BYCOLS    { setorder(BYCOLS); }
  512.     |    K_BYROWS    { setorder(BYROWS); }
  513.     |    K_NUMERIC    { numeric = 1; }
  514.     |    '!' K_NUMERIC    { numeric = 0; }
  515.     |    K_PRESCALE    { prescale = 0.01; }
  516.     |    '!' K_PRESCALE    { prescale = 1.0; }
  517.     |    K_EXTFUN    { extfunc = 1; }
  518.     |    '!' K_EXTFUN    { extfunc = 0; }
  519.     |    K_CELLCUR    { showcell = 1; }
  520.     |    '!' K_CELLCUR    { showcell = 0; }
  521.     |    K_TOPROW    { showtop = 1; }
  522.     |    '!' K_TOPROW    { showtop = 0; }
  523.     |    K_ITERATIONS '=' NUMBER    { setiterations($3); }
  524.     |    K_TBLSTYLE '=' NUMBER    { tbl_style = $3; }
  525.     |    K_TBLSTYLE '=' K_TBL    { tbl_style = TBL; }
  526.     |    K_TBLSTYLE '=' K_LATEX    { tbl_style = LATEX; }
  527.     |    K_TBLSTYLE '=' K_SLATEX    { tbl_style = SLATEX; }
  528.     |    K_TBLSTYLE '=' K_TEX    { tbl_style = TEX; }
  529.     |    K_TBLSTYLE '=' K_FRAME    { tbl_style = FRAME; }
  530.     |    K_RNDINFINITY        { rndinfinity = 1; FullUpdate++; }
  531.     |    '!' K_RNDINFINITY    { rndinfinity = 0; FullUpdate++; }
  532.     |    K_CRACTION '=' NUMBER    { craction = $3; }
  533.     |    K_ROWLIMIT '=' NUMBER    { rowlimit = $3; }
  534.     |    K_COLLIMIT '=' NUMBER    { collimit = $3; }
  535.       ;
  536.  
  537. /* types of errors, to 'goto' */
  538. errlist :    K_ERROR        { num_search((double)0, CELLERROR); }
  539.     |    K_INVALID    { num_search((double)0, CELLINVALID); }
  540.     ;
  541.