X-Git-Url: https://git.kengrimes.com/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Fparser.y;h=41c4095c2b7e6a9f1b6fe1f0be282ac033d804d3;hp=9fe82df01a281f717e99f39fe5a55ed71d8ba20f;hb=009ed5598365bf7fed5042496c070a40c7c9246d;hpb=c719f3e6c6663f6640422d81c156231c84cdcbdf diff --git a/src/parser.y b/src/parser.y index 9fe82df..41c4095 100644 --- a/src/parser.y +++ b/src/parser.y @@ -24,10 +24,10 @@ 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); }