fixes
[henge/apc.git] / src / parser.y
index 9fe82df..41c4095 100644 (file)
 
   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)))
 }
@@ -79,9 +79,9 @@ class_list:
 ;
 
 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:
@@ -109,13 +109,13 @@ data_spec:
 ;
 
 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:
@@ -133,7 +133,9 @@ frame_spec:
 
 static
 void yyerror
-( char const *s )
+( yycstate* cs,
+  char const *s
+)
 { fprintf(stderr, "%s\n", s); }
 
 yycstate* yycstate_new
@@ -141,14 +143,28 @@ 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); }