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 ']' ;