extern long sys_pagesize;
extern int lexer();
- static void yyerror(char const*);
+ static void yyerror(yycstate*, char const*);
+ static inline ir_class yyclass_push(yycstate*, ir_class);
+ static inline ir_class yyclass_pop(yycstate*);
/* Stack-based class handler */
- #define CLASS_POP(CS) (*--(CS-csp))
- #define CLASS_PUSH(CS,CL) (*(CS->csp)++ = CL
#define yyclass(CS) (*(CS->csp))
#define yyclassld(CS) (ir_classld_from_class(yyclass(CS)))
}
;
class:
- NAME CLOPEN { CLASS_PUSH(cs,ir_class_addchild(yyclass, $1)); }
+ NAME CLOPEN { yyclass_push(cs,ir_class_addchild(yyclass(cs), $1)); }
progn
- CLCLOSE { CLASS_POP(cs); }
+ CLCLOSE { yyclass_pop(cs); }
;
statement_list:
;
set_spec:
- set_spec NAME { $$ = ir_set_addchild($1,$2); }
-| NAME { $$ = ir_class_addset(yyclass,$1); }
+ set_spec NAME { $$ = ir_set_addchild($1,$2); }
+| NAME { $$ = ir_class_addset(yyclass(cs),$1); }
;
set_link:
set_link NAME { $$ = ir_setld_addchild($1,$2); }
-| NAME { $$ = ir_setld_from_classld(yyclassld,$1) }
+| NAME { $$ = ir_setld_from_classld(yyclassld(cs),$1); }
;
set_ld:
static
void yyerror
-( char const *s )
+( yycstate* cs,
+ char const *s
+)
{ fprintf(stderr, "%s\n", s); }
yycstate* yycstate_new
{ yycstate* class_state;
class_state = (yycstate*) malloc((size_t) sys_pagesize);
if(class_state == NULL)
- { yyerror(ERR_MEM);
- exit(1);
+ { yyerror(class_state, "Memory allocation error.");
+ return NULL;
}
class_state->csp = &class_state->class_stack[0];
- CLASS_PUSH(class_state, ir_class_root());
+ yyclass_push(class_state, ir_class_root());
return class_state;
}
+static inline
+ir_class yyclass_pop
+( yycstate* cs )
+{ return *(cs->csp)--; }
+
+static inline
+ir_class yyclass_push
+( yycstate* cs,
+ ir_class class
+)
+{ *++cs->csp = class;
+ return class;
+}
+
void yycstate_delete
( yycstate* class_state )
{ free(class_state); }