program:
/* empty */
| stmts ';'
;
stmts:
stmt
| stmts ';' stmt
;
stmt:
derivative
| define
| declare
| control
;
control: INITIALV '=' initials
;
initials: expr
| initials ',' expr
;
derivative:
DIFF '(' id ',' id ')' '=' expr
;
define:
id '=' expr
;
declare:
EXTRN settype declrs
;
declrs:
declare_one
| declrs ',' declare_one
;
declare_one:
decl_id
| declare_one decl_array
;
decl_id:
ID
;
decl_array: '[' INTCON ']'
| '[' ']'
;
settype: /* empty */
| INT
| SHORT
| CHAR
| REAL
;
id:
ID
;
bexpr:
expr EQ expr
| expr NEQ expr
| expr GE expr
| expr GT expr
| expr LE expr
| expr LT expr
| bexpr AND bexpr
| bexpr OR bexpr
| '(' bexpr ')'
;
expr:
term
| expr '^' expr
| expr '*' expr
| expr '/' expr
| expr '+' expr
| expr '-' expr
| '-' expr %prec UNARY
| '+' expr %prec UNARY
| IF '(' bexpr ')' '{' expr '}' ELSE '{' expr '}'
;
term:
idexpr
| idexpr arrayref
| INTCON
| FLOATCON
| '(' expr ')'
| '(' error ')'
| idexpr '(' expr ')'
| SUM
'(' expr ',' idexpr '=' expr ',' expr ')'
;
idexpr:
ID
;
arrayref: one_idx
| arrayref one_idx
;
one_idx:
'[' expr ']'
;