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 >
Wrap
Text File
|
1988-08-29
|
4KB
|
158 lines
/* SC A Spreadsheet Calculator
* Command and expression parser
*
* original by James Gosling, September 1982
* modified by Mark Weiser and Bruce Israel,
* University of Maryland
*
*/
%{
#include "sc.h"
%}
%union {
long ival;
double fval;
struct ent *ent;
struct enode *enode;
char *sval;
struct lnode *lnode;
}
%type <lnode> elist
%type <enode> e term elistterm
%type <ent> var
%token <sval> STRING
%token <ival> NUMBER
%type <ival> row, col
%token <fval> FNUMBER
%token <sval> WORD
%type <ival> reduce_op
%type <ival> func_1
%token S_FORMAT
%token S_LABEL
%token S_LEFTSTRING
%token S_RIGHTSTRING
%token S_GET
%token S_PUT
%token S_MERGE
%token S_LET
%token S_WRITE
%token S_TBL
%token S_PROGLET
%token K_EXEC
%token K_FIXED
%token K_ABS
%token K_ACOS
%token K_ASIN
%token K_ATAN
%token K_CEIL
%token K_COS
%token K_EXP
%token K_FLOOR
%token K_HYPOT
%token K_LN
%token K_LOG
%token K_SIN
%token K_SQRT
%token K_TAN
%token K_R
%token K_C
%left '?' ':'
%left '|'
%left '&'
%nonassoc '<' '=' '>'
%left '+' '-'
%left '*' '/'
%%
command: S_LET var '=' e { let ($2, $4); }
| S_LABEL var '=' STRING
{ label ($2, $4, 0); }
| S_LEFTSTRING var '=' STRING
{ label ($2, $4, -1); }
| S_RIGHTSTRING var '=' STRING
{ label ($2, $4, 1); }
| S_FORMAT NUMBER NUMBER NUMBER
{ fwidth[$2] = $3;
FullUpdate++;
modflg++;
precision[$2] = $4; }
| S_GET STRING { readfile ($2,1); }
| S_MERGE STRING { readfile ($2,0); }
| S_PUT STRING { writefile ($2); }
| S_WRITE STRING { printfile ($2); }
| S_TBL STRING { tblprintfile ($2); }
| /* nothing */
| error;
elist: elist ',' elistterm { $$ = addlist( $1 , $3 ) ; }
| elistterm { $$ = newlist( $1 ); }
;
elistterm: e { $$ = $1; }
| STRING { $$ = new ('s' , $1 , 0 ); }
;
term:
func_1 '(' e ')' { $$ = new ($1, $3, 0); }
| K_EXEC '(' STRING ',' elist ')' { $$ = new('p', $3, $5); }
| var { $$ = new ('v', $1); }
| K_FIXED term { $$ = new ('f', 0, $2); }
| reduce_op '/' var ':' var
{ $$ = new (O_REDUCE($1), $3, $5); }
| '(' e ')' { $$ = $2; }
| '+' term { $$ = $2; }
| '-' term { $$ = new ('m', 0, $2); }
| NUMBER { double h= (double)$1; $$ = new ('k', &h, 0); }
| FNUMBER { $$ = new ('k', &$1, 0); }
| '~' term { $$ = new ('~', 0, $2); }
| '!' term { $$ = new ('~', 0, $2); }
;
e: e '+' e { $$ = new ('+', $1, $3); }
| e '-' e { $$ = new ('-', $1, $3); }
| e '*' e { $$ = new ('*', $1, $3); }
| e '/' e { $$ = new ('/', $1, $3); }
| term
| e '?' e ':' e { $$ = new ('?', $1, new(':', $3, $5)); }
| e '<' e { $$ = new ('<', $1, $3); }
| e '=' e { $$ = new ('=', $1, $3); }
| e '>' e { $$ = new ('>', $1, $3); }
| e '&' e { $$ = new ('&', $1, $3); }
| e '|' e { $$ = new ('|', $1, $3); }
| e '<' '=' e { $$ = new ('~', 0, new ('>', $1, $4)); }
| e '!' '=' e { $$ = new ('~', 0, new ('=', $1, $4)); }
| e '>' '=' e { $$ = new ('~', 0, new ('<', $1, $4)); }
;
row: K_R NUMBER { $$ = $2; };
col: K_C NUMBER { $$ = $2; };
var: row col { $$ = lookat($1, $2); }
| col row { $$ = lookat($2, $1); };
reduce_op: '+' { $$ = '+'; }
| '*' { $$ = '*'; }
;
func_1: K_ABS { $$ = K_ABS; }
| K_ACOS { $$ = K_ACOS; }
| K_ASIN { $$ = K_ASIN; }
| K_ATAN { $$ = K_ATAN; }
| K_CEIL { $$ = K_CEIL; }
| K_COS { $$ = K_COS; }
| K_EXP { $$ = K_EXP; }
| K_FLOOR { $$ = K_FLOOR; }
| K_HYPOT { $$ = K_HYPOT; }
| K_LN { $$ = K_LN; }
| K_LOG { $$ = K_LOG; }
| K_SIN { $$ = K_SIN; }
| K_SQRT { $$ = K_SQRT; }
| K_TAN { $$ = K_TAN; }
;