home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / C / VC / gram.y < prev    next >
Text File  |  1988-08-29  |  4KB  |  158 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.  */
  9.  
  10.  
  11.  
  12. %{
  13. #include "sc.h"
  14. %}
  15.  
  16. %union {
  17.     long ival;
  18.     double fval;
  19.     struct ent *ent;
  20.     struct enode *enode;
  21.     char *sval;
  22.     struct lnode *lnode;
  23. }
  24.  
  25. %type <lnode> elist 
  26. %type <enode> e term elistterm
  27. %type <ent> var
  28. %token <sval> STRING
  29. %token <ival> NUMBER
  30. %type <ival> row, col
  31. %token <fval> FNUMBER
  32. %token <sval> WORD
  33. %type <ival> reduce_op
  34. %type <ival> func_1
  35. %token S_FORMAT
  36. %token S_LABEL
  37. %token S_LEFTSTRING
  38. %token S_RIGHTSTRING
  39. %token S_GET
  40. %token S_PUT
  41. %token S_MERGE
  42. %token S_LET
  43. %token S_WRITE
  44. %token S_TBL
  45. %token S_PROGLET
  46. %token K_EXEC
  47. %token K_FIXED
  48. %token K_ABS
  49. %token K_ACOS
  50. %token K_ASIN
  51. %token K_ATAN
  52. %token K_CEIL
  53. %token K_COS
  54. %token K_EXP
  55. %token K_FLOOR
  56. %token K_HYPOT
  57. %token K_LN
  58. %token K_LOG
  59. %token K_SIN
  60. %token K_SQRT
  61. %token K_TAN
  62. %token K_R
  63. %token K_C
  64.  
  65. %left '?' ':'
  66. %left '|'
  67. %left '&'
  68. %nonassoc '<' '=' '>'
  69. %left '+' '-'
  70. %left '*' '/'
  71.  
  72. %%
  73. command:    S_LET var '=' e    { let ($2, $4); }
  74.     |    S_LABEL var '=' STRING
  75.                 { label ($2, $4, 0); }
  76.     |    S_LEFTSTRING var '=' STRING
  77.                 { label ($2, $4, -1); }
  78.     |    S_RIGHTSTRING var '=' STRING
  79.                 { label ($2, $4, 1); }
  80.     |    S_FORMAT NUMBER NUMBER NUMBER
  81.                 { fwidth[$2] = $3;
  82.                   FullUpdate++;
  83.                   modflg++;
  84.                   precision[$2] = $4; }
  85.     |    S_GET STRING    { readfile ($2,1); }
  86.     |    S_MERGE STRING    { readfile ($2,0); }
  87.     |    S_PUT STRING    { writefile ($2); }
  88.     |    S_WRITE STRING    { printfile ($2); }
  89.     |    S_TBL STRING    { tblprintfile ($2); }
  90.     |    /* nothing */
  91.     |    error;
  92.  
  93. elist:        elist ',' elistterm    { $$ = addlist( $1 , $3 ) ; }
  94.     |    elistterm    { $$ = newlist( $1 ); }
  95.     ;
  96.  
  97. elistterm:     e        { $$ = $1; }
  98.     |    STRING        { $$ = new ('s' , $1 , 0 ); }
  99.     ;
  100.  
  101. term:    
  102.          func_1 '(' e ')'    { $$ = new ($1, $3, 0); }
  103.     |    K_EXEC '(' STRING ',' elist ')' { $$ = new('p', $3, $5); }
  104.     |    var        { $$ = new ('v', $1); }
  105.     |    K_FIXED term    { $$ = new ('f', 0, $2); }
  106.     |    reduce_op '/' var ':' var
  107.                 { $$ = new (O_REDUCE($1), $3, $5); }
  108.     |    '(' e ')'    { $$ = $2; }
  109.     |    '+' term    { $$ = $2; }
  110.     |    '-' term    { $$ = new ('m', 0, $2); }
  111.     |    NUMBER        { double h= (double)$1; $$ = new ('k', &h, 0); }
  112.     |    FNUMBER        { $$ = new ('k', &$1, 0); }
  113.     |    '~' term    { $$ = new ('~', 0, $2); }
  114.     |    '!' term    { $$ = new ('~', 0, $2); }
  115.     ;
  116.  
  117. e:        e '+' e        { $$ = new ('+', $1, $3); }
  118.     |    e '-' e        { $$ = new ('-', $1, $3); }
  119.     |    e '*' e        { $$ = new ('*', $1, $3); }
  120.     |    e '/' e        { $$ = new ('/', $1, $3); }
  121.     |    term
  122.     |    e '?' e ':' e    { $$ = new ('?', $1, new(':', $3, $5)); }
  123.     |    e '<' e        { $$ = new ('<', $1, $3); }
  124.     |    e '=' e        { $$ = new ('=', $1, $3); }
  125.     |    e '>' e        { $$ = new ('>', $1, $3); }
  126.     |    e '&' e        { $$ = new ('&', $1, $3); }
  127.     |    e '|' e        { $$ = new ('|', $1, $3); }
  128.     |    e '<' '=' e    { $$ = new ('~', 0, new ('>', $1, $4)); }
  129.     |    e '!' '=' e    { $$ = new ('~', 0, new ('=', $1, $4)); }
  130.     |    e '>' '=' e    { $$ = new ('~', 0, new ('<', $1, $4)); }
  131.     ;
  132.  
  133. row:        K_R NUMBER    { $$ = $2; };
  134. col:        K_C NUMBER    { $$ = $2; };
  135. var:        row col        { $$ = lookat($1, $2); }
  136.     |    col row        { $$ = lookat($2, $1); };
  137.  
  138. reduce_op:    '+'        { $$ = '+'; }
  139.     |    '*'        { $$ = '*'; }
  140.     ;
  141.  
  142.  
  143. func_1:        K_ABS    { $$ = K_ABS; }
  144.     |        K_ACOS    { $$ = K_ACOS; }
  145.     |        K_ASIN    { $$ = K_ASIN; }
  146.     |        K_ATAN    { $$ = K_ATAN; }
  147.     |        K_CEIL    { $$ = K_CEIL; }
  148.     |        K_COS    { $$ = K_COS; }
  149.     |        K_EXP    { $$ = K_EXP; }
  150.     |        K_FLOOR    { $$ = K_FLOOR; }
  151.     |        K_HYPOT    { $$ = K_HYPOT; }
  152.     |        K_LN    { $$ = K_LN; }
  153.     |        K_LOG    { $$ = K_LOG; }
  154.     |        K_SIN    { $$ = K_SIN; }
  155.     |        K_SQRT    { $$ = K_SQRT; }
  156.     |        K_TAN    { $$ = K_TAN; }
  157.     ;
  158.