errorCode parseNext(Parser* parser) { errorCode tmp_err_code = UNEXPECTED_ERROR; SmallIndex tmpNonTermID = GR_VOID_NON_TERMINAL; tmp_err_code = processNextProduction(&parser->strm, &tmpNonTermID, &parser->handler, parser->app_data); if(tmp_err_code != ERR_OK) return tmp_err_code; if(tmpNonTermID == GR_VOID_NON_TERMINAL) { EXIGrammar* grammar; popGrammar(&(parser->strm.gStack), &grammar); if(parser->strm.gStack == NULL) // There is no more grammars in the stack { parser->strm.context.currNonTermID = GR_VOID_NON_TERMINAL; // The stream is parsed } else { parser->strm.context.currNonTermID = parser->strm.gStack->lastNonTermID; } } else { parser->strm.context.currNonTermID = tmpNonTermID; } if(parser->strm.context.currNonTermID == GR_VOID_NON_TERMINAL) return PARSING_COMPLETE; return ERR_OK; }
END_TEST START_TEST (test_popGrammar) { errorCode err = EXIP_UNEXPECTED_ERROR; EXIGrammarStack* testGrStack = NULL; EXIGrammar testElementGrammar1; EXIStream strm; EXIGrammar testElementGrammar; QNameID emptyQnameID = {URI_MAX, LN_MAX}; makeDefaultOpts(&strm.header.opts); initAllocList(&strm.memList); #if BUILD_IN_GRAMMARS_USE err = createBuiltInElementGrammar(&testElementGrammar1, &strm); fail_if(err != EXIP_OK); err = createBuiltInElementGrammar(&testElementGrammar, &strm); fail_if(err != EXIP_OK); #endif err = pushGrammar(&testGrStack, emptyQnameID, &testElementGrammar1); fail_unless (err == EXIP_OK, "pushGrammar returns error code %d", err); err = pushGrammar(&testGrStack, emptyQnameID, &testElementGrammar); fail_unless (err == EXIP_OK, "pushGrammar returns error code %d", err); fail_if(testGrStack->nextInStack == NULL); popGrammar(&testGrStack); fail_if(testGrStack->nextInStack != NULL); }
void destroyParser(Parser* parser) { EXIGrammar* tmp; while(parser->strm.gStack != NULL) { popGrammar(&parser->strm.gStack, &tmp); } freeAllMem(&parser->strm); }