int main() { size_t i; /* Object types */ marpaWrapper_t *marpaWrapperp; marpaWrapperRecognizer_t *marpaWrapperRecognizerp; marpaWrapperSymbolArrayp_t symbolArrayp[MAX_SYMBOL]; marpaWrapperSymbolArrayp_t rhsSymbolArrayp[3]; /* Just to have enough room */ /* Options */ marpaWrapperOption_t marpaWrapperOption; marpaWrapperSymbolOption_t marpaWrapperSymbolOption; marpaWrapperRuleOption_t marpaWrapperRuleOption; marpaWrapperValueOption_t marpaWrapperValueOption; marpaWrapperStackOption_t marpaWrapperStackOption; size_t nmarpaWrapperProgressi; marpaWrapperProgress_t **marpaWrapperProgresspp; /* Token values */ const char *token_values[] = { NULL, "1", "2", "3", "0", "-", "+", "*" }; int one = 1; /* Indice 1 in token_values */ int two = 2; /* Indice 2 in token_values */ int three = 3; /* Indice 3 in token_values */ int zero = 4; /* Indice 4 in token_values */ int minus_token_value = 5; /* Indice 5 in token_values */ int plus_token_value = 6; /* Indice 6 in token_values */ int multiply_token_value = 7; /* Indice 7 in token_values */ genericLoggerOption_t genericLoggerOption; genericLogger_t *genericLoggerp; genericLogger_defaultv(&genericLoggerOption); genericLoggerOption.leveli = GENERICLOGGER_LOGLEVEL_TRACE; genericLoggerp = genericLogger_newp(&genericLoggerOption); /* We want TRACE log level */ marpaWrapperOption_defaultb(&marpaWrapperOption); marpaWrapperOption.genericLoggerp = genericLoggerp; /* Grammar */ marpaWrapperp = marpaWrapper_newp(&marpaWrapperOption); /* Symbols */ for (i = 0; i < MAX_SYMBOL; i++) { marpaWrapperSymbolOption_defaultb(&(marpaWrapperSymbolOption)); marpaWrapperSymbolOption.startb = (i == 0) ? MARPAWRAPPER_BOOL_TRUE : MARPAWRAPPER_BOOL_FALSE; symbolArrayp[i] = marpaWrapper_addSymbolp(marpaWrapperp, &marpaWrapperSymbolOption); } /* Rules */ marpaWrapperRuleOption_defaultb(&marpaWrapperRuleOption); marpaWrapperRuleOption.rhsSymbolArraypp = &(rhsSymbolArrayp[0]); /* S ::= E */ marpaWrapperRuleOption.lhsSymbolp = symbolArrayp[S]; rhsSymbolArrayp[0] = symbolArrayp[E]; marpaWrapperRuleOption.nRhsSymboli = 1; marpaWrapperRuleOption.datavp = (void *) START_RULE; marpaWrapper_addRulep(marpaWrapperp, &marpaWrapperRuleOption); /* E ::= E op E */ marpaWrapperRuleOption.lhsSymbolp = symbolArrayp[ E]; rhsSymbolArrayp[0] = symbolArrayp[ E]; rhsSymbolArrayp[1] = symbolArrayp[op]; rhsSymbolArrayp[2] = symbolArrayp[ E]; marpaWrapperRuleOption.nRhsSymboli = 3; marpaWrapperRuleOption.datavp = (void *) OP_RULE; marpaWrapper_addRulep(marpaWrapperp, &marpaWrapperRuleOption); /* E ::= number */ marpaWrapperRuleOption.lhsSymbolp = symbolArrayp[ E]; rhsSymbolArrayp[0] = symbolArrayp[number]; marpaWrapperRuleOption.nRhsSymboli = 1; marpaWrapperRuleOption.datavp = (void *) NUMBER_RULE; marpaWrapper_addRulep(marpaWrapperp, &marpaWrapperRuleOption); marpaWrapper_precomputeb(marpaWrapperp); marpaWrapperRecognizerp = marpaWrapperRecognizer_newp(marpaWrapperp); if (marpaWrapperRecognizer_progressb(marpaWrapperRecognizerp, -1, -1, &nmarpaWrapperProgressi, &marpaWrapperProgresspp) == MARPAWRAPPER_BOOL_TRUE) { for (i = 0; i < nmarpaWrapperProgressi; i++) { GENERICLOGGER_INFOX("Earley Set Id: %4d, Origin Earley Set Id: %4d, Rule: %10p, Position: %3d", marpaWrapperProgresspp[i]->marpaEarleySetIdi, marpaWrapperProgresspp[i]->marpaEarleySetIdOrigini, (void *) marpaWrapperProgresspp[i]->marpaWrapperRulep, marpaWrapperProgresspp[i]->positioni); } marpaWrapperRecognizer_progress_freev(marpaWrapperRecognizerp, &nmarpaWrapperProgressi, &marpaWrapperProgresspp); } marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolArrayp[number], two, 1); marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolArrayp[ op], minus_token_value, 1); marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolArrayp[number], zero, 1); marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolArrayp[ op], multiply_token_value, 1); marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolArrayp[number], three, 1); #ifdef _WIN32 // Sleep(10000); #endif if (marpaWrapperRecognizer_progressb(marpaWrapperRecognizerp, 0, -1, &nmarpaWrapperProgressi, &marpaWrapperProgresspp) == MARPAWRAPPER_BOOL_TRUE) { for (i = 0; i < nmarpaWrapperProgressi; i++) { GENERICLOGGER_INFOX("Earley Set Id: %4d, Origin Earley Set Id: %4d, Rule: %10p, Position: %3d", marpaWrapperProgresspp[i]->marpaEarleySetIdi, marpaWrapperProgresspp[i]->marpaEarleySetIdOrigini, (void *) marpaWrapperProgresspp[i]->marpaWrapperRulep, marpaWrapperProgresspp[i]->positioni); } marpaWrapperRecognizer_progress_freev(marpaWrapperRecognizerp, &nmarpaWrapperProgressi, &marpaWrapperProgresspp); } marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolArrayp[ op], plus_token_value, 1); marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolArrayp[number], one, 1); marpaWrapperValueOption_defaultb(&marpaWrapperValueOption); marpaWrapperValueOption.valueRuleCallbackp = &myValueRuleCallback; marpaWrapperValueOption.valueSymbolCallbackp = &myValueSymbolCallback; marpaWrapperValueOption.valueSymbolCallbackDatavp = (void *) token_values; marpaWrapperValueOption.valueNullingCallbackp = &myValueNullingCallback; marpaWrapperValueOption.valueResultCallbackp = &myValueResultCallback; marpaWrapperValueOption.valueResultCallbackDatavp = genericLoggerp; marpaWrapperStackOption_defaultb(&marpaWrapperStackOption); marpaWrapperStackOption.stackElementSizei = sizeof(myStack_t); marpaWrapperStackOption.stackElementFreeCallbackp = &myStackElementFreeCallback; marpaWrapperStackOption.stackElementCopyCallbackp = &myStackElementCopyCallback; #ifdef _WIN32 // Sleep(10000); #endif marpaWrapper_vb(marpaWrapperRecognizerp, &marpaWrapperValueOption, &marpaWrapperStackOption); marpaWrapperRecognizer_destroyv(marpaWrapperRecognizerp); marpaWrapper_destroyv(marpaWrapperp); genericLogger_destroyv(genericLoggerp); return 0; }
int main(int argc, char **argv) /****************************************************************************/ { marpaWrapperGrammar_t *marpaWrapperGrammarp = NULL; marpaWrapperGrammar_t *marpaWrapperGrammarOriginalp = NULL; marpaWrapperRecognizer_t *marpaWrapperRecognizerp = NULL; marpaWrapperValue_t *marpaWrapperValuep = NULL; marpaWrapperAsfValue_t *marpaWrapperAsfValuep = NULL; int symbolip[MAX_SYMBOL]; int ruleip[MAX_RULE]; int rci = 0; int *symbolArrayp = NULL; size_t neventl; size_t nsymboll; int i; int outputStackSizei; valueContext_t valueContext = { NULL, NULL, NULL, symbolip, ruleip, NULL, NULL, GENERICLOGGER_NEW(GENERICLOGGER_LOGLEVEL_TRACE) }; int symbolPropertyBitSet; int symbolEventBitSet; int rulePropertyBitSet; marpaWrapperGrammarOption_t marpaWrapperGrammarOption = { GENERICLOGGER_NEW(GENERICLOGGER_LOGLEVEL_TRACE), 0 /* warningIsErrorb */, 0 /* warningIsIgnoredb */, 0 /* autorankb */, }; marpaWrapperRecognizerOption_t marpaWrapperRecognizerOption = { GENERICLOGGER_NEW(GENERICLOGGER_LOGLEVEL_TRACE), 0, /* disableThresholdb */ 0 /* exhaustion */ }; marpaWrapperValueOption_t marpaWrapperValueOption = { GENERICLOGGER_NEW(GENERICLOGGER_LOGLEVEL_TRACE), 1 /* highRankOnlyb */, 1 /* orderByRankb */, 1 /* ambiguousb - We KNOW this test is ambiguous */, 0 /* nullb */, 0 /* maxParsesi */ }; marpaWrapperAsfOption_t marpaWrapperAsfOption = { GENERICLOGGER_NEW(GENERICLOGGER_LOGLEVEL_TRACE), 1 /* highRankOnlyb */, 1 /* orderByRankb */, 1 /* ambiguousb - We KNOW this test is ambiguous */, 0 /* maxParsesi */ }; GENERICSTACK_NEW(valueContext.inputStackp); if (valueContext.inputStackp == NULL) { perror("GENERICSTACK_NEW"); exit(1); } GENERICSTACK_NEW(valueContext.outputStackp); if (valueContext.outputStackp == NULL) { perror("GENERICSTACK_NEW"); exit(1); } marpaWrapperGrammarp = marpaWrapperGrammar_newp(&marpaWrapperGrammarOption); if ( /* S (start symbol automatically), E, op, number */ ((symbolip[ S] = MARPAWRAPPERGRAMMAR_NEWSYMBOL(marpaWrapperGrammarp)) < 0) || ((symbolip[ E] = MARPAWRAPPERGRAMMAR_NEWSYMBOL(marpaWrapperGrammarp)) < 0) || ((symbolip[ op] = MARPAWRAPPERGRAMMAR_NEWSYMBOL(marpaWrapperGrammarp)) < 0) || ((symbolip[number] = MARPAWRAPPERGRAMMAR_NEWSYMBOL(marpaWrapperGrammarp)) < 0) || /* S ::= E */ /* E ::= E op E */ /* E ::= number */ ((ruleip[ START_RULE] = MARPAWRAPPERGRAMMAR_NEWRULE(marpaWrapperGrammarp, symbolip[S], symbolip[E], -1)) < 0) || ((ruleip[ OP_RULE] = MARPAWRAPPERGRAMMAR_NEWRULE(marpaWrapperGrammarp, symbolip[E], symbolip[E], symbolip[op], symbolip[E], -1)) < 0) || ((ruleip[NUMBER_RULE] = MARPAWRAPPERGRAMMAR_NEWRULE(marpaWrapperGrammarp, symbolip[E], symbolip[number], -1)) < 0) ) { rci = 1; } if (rci == 0) { /* We will work on a cloned grammar */ genericLogger_t *tmpLoggerp = GENERICLOGGER_NEW(GENERICLOGGER_LOGLEVEL_TRACE); marpaWrapperGrammarCloneOption.userDatavp = (void *) tmpLoggerp; marpaWrapperGrammar_t *marpaWrapperGrammarClonep = marpaWrapperGrammar_clonep(marpaWrapperGrammarp, &marpaWrapperGrammarCloneOption); GENERICLOGGER_FREE(tmpLoggerp); if (marpaWrapperGrammarClonep == NULL) { rci = 1; } else { marpaWrapperGrammarOriginalp = marpaWrapperGrammarp; marpaWrapperGrammarp = marpaWrapperGrammarClonep; if (marpaWrapperGrammar_precomputeb(marpaWrapperGrammarp) == 0) { rci = 1; } } } if (rci == 0) { if (marpaWrapperGrammar_eventb(marpaWrapperGrammarp, &neventl, NULL, 0 /* exhaustionEventb */, 0) == 0) { rci = 1; } } if (rci == 0) { if (marpaWrapperGrammar_symbolPropertyb(marpaWrapperGrammarp, symbolip[S], &symbolPropertyBitSet) == 0) { rci = 1; } else { if ((symbolPropertyBitSet & MARPAWRAPPER_SYMBOL_IS_START) != MARPAWRAPPER_SYMBOL_IS_START) { perror("symbolip[S] does not have the MARPAWRAPPER_SYMBOL_IS_START bit set"); rci = 1; } } } if (rci == 0) { if (marpaWrapperGrammar_symbolEventb(marpaWrapperGrammarp, symbolip[S], &symbolEventBitSet) == 0) { rci = 1; } else { if (symbolEventBitSet != 0) { perror("symbolip[S] has an event"); rci = 1; } } } if (rci == 0) { if (marpaWrapperGrammar_rulePropertyb(marpaWrapperGrammarp, ruleip[NUMBER_RULE], &rulePropertyBitSet) == 0) { rci = 1; } else { if ((rulePropertyBitSet & MARPAWRAPPER_RULE_IS_PRODUCTIVE) != MARPAWRAPPER_RULE_IS_PRODUCTIVE) { perror("ruleip[NUMBER_RULE] does not have the MARPAWRAPPER_RULE_IS_PRODUCTIVE bit set"); rci = 1; } } } if (rci == 0) { marpaWrapperRecognizerp = marpaWrapperRecognizer_newp(marpaWrapperGrammarp, &marpaWrapperRecognizerOption); if (marpaWrapperRecognizerp == NULL) { rci = 1; } } if (rci == 0) { valueContext.marpaWrapperRecognizerp = marpaWrapperRecognizerp; /* We use the stack indices directly into Marpa, and Marpa does not like indice 0 which means "unvalued". */ /* Nevertheless, during the value phase, indice 0 will be used */ GENERICSTACK_PUSH_PTR(valueContext.inputStackp, NULL); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } /* --------------------------------------------------------------- */ /* 2 - 0 * 3 + 1 */ /* --------------------------------------------------------------- */ if (rci == 0) { if (marpaWrapperRecognizer_progressLogb(marpaWrapperRecognizerp, 0, -1, GENERICLOGGER_LOGLEVEL_INFO, NULL, symbolDescription) == 0) { rci = 1; } } /* ------ */ /* number */ /* ------ */ if (rci == 0) { GENERICSTACK_PUSH_INT(valueContext.inputStackp, 2); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolip[number], GENERICSTACK_USED(valueContext.inputStackp) - 1 /* value */, 1 /* length */) == 0) { rci = 1; } } if (rci == 0) { int earleySetIdi; if (marpaWrapperRecognizer_latestb(marpaWrapperRecognizerp, &earleySetIdi) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Latest Earleme Set ID: %d", earleySetIdi); } } /* -- */ /* op */ /* -- */ if (rci == 0) { GENERICSTACK_PUSH_CHAR(valueContext.inputStackp, '-'); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolip[op], GENERICSTACK_USED(valueContext.inputStackp) - 1 /* value */, 1 /* length */) == 0) { rci = 1; } } if (rci == 0) { int earleySetIdi; if (marpaWrapperRecognizer_latestb(marpaWrapperRecognizerp, &earleySetIdi) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Latest Earleme Set ID: %d", earleySetIdi); } } /* ------ */ /* number */ /* ------ */ if (rci == 0) { GENERICSTACK_PUSH_INT(valueContext.inputStackp, 0); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolip[number], GENERICSTACK_USED(valueContext.inputStackp) - 1 /* value */, 1 /* length */) == 0) { rci = 1; } } if (rci == 0) { int earleySetIdi; if (marpaWrapperRecognizer_latestb(marpaWrapperRecognizerp, &earleySetIdi) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Latest Earleme Set ID: %d", earleySetIdi); } } /* -- */ /* op */ /* -- */ if (rci == 0) { GENERICSTACK_PUSH_CHAR(valueContext.inputStackp, '*'); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolip[op], GENERICSTACK_USED(valueContext.inputStackp) - 1 /* value */, 1 /* length */) == 0) { rci = 1; } } if (rci == 0) { int earleySetIdi; if (marpaWrapperRecognizer_latestb(marpaWrapperRecognizerp, &earleySetIdi) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Latest Earleme Set ID: %d", earleySetIdi); } } /* ------ */ /* number */ /* ------ */ if (rci == 0) { GENERICSTACK_PUSH_INT(valueContext.inputStackp, 3); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolip[number], GENERICSTACK_USED(valueContext.inputStackp) - 1 /* value */, 1 /* length */) == 0) { rci = 1; } } if (rci == 0) { int earleySetIdi; if (marpaWrapperRecognizer_latestb(marpaWrapperRecognizerp, &earleySetIdi) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Latest Earleme Set ID: %d", earleySetIdi); } } /* -- */ /* op */ /* -- */ if (rci == 0) { GENERICSTACK_PUSH_CHAR(valueContext.inputStackp, '+'); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolip[op], GENERICSTACK_USED(valueContext.inputStackp) - 1 /* value */, 1 /* length */) == 0) { rci = 1; } } if (rci == 0) { int earleySetIdi; if (marpaWrapperRecognizer_latestb(marpaWrapperRecognizerp, &earleySetIdi) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Latest Earleme Set ID: %d", earleySetIdi); } } /* ------ */ /* number */ /* ------ */ if (rci == 0) { GENERICSTACK_PUSH_INT(valueContext.inputStackp, 1); if (GENERICSTACK_ERROR(valueContext.inputStackp)) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_readb(marpaWrapperRecognizerp, symbolip[number], GENERICSTACK_USED(valueContext.inputStackp) - 1 /* value */, 1 /* length */) == 0) { rci = 1; } } if (rci == 0) { int earleySetIdi; if (marpaWrapperRecognizer_latestb(marpaWrapperRecognizerp, &earleySetIdi) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Latest Earleme Set ID: %d", earleySetIdi); } } if (rci == 0) { if (marpaWrapperRecognizer_event_onoffb(marpaWrapperRecognizerp, symbolip[S], MARPAWRAPPERGRAMMAR_EVENTTYPE_PREDICTION, 0) == 0) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_exhaustedb(marpaWrapperRecognizerp, NULL) == 0) { rci = 1; } } if (rci == 0) { if (marpaWrapperRecognizer_expectedb(marpaWrapperRecognizerp, &nsymboll, &symbolArrayp) == 0) { rci = 1; } else { GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "Number of expected symbols: %ld", (unsigned long) nsymboll); if (nsymboll > 0) { for (i = 0; i < (int) nsymboll; i++) { switch (symbolArrayp[i]) { case S: GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Expected symbol No %d: S", i); break; case E: GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Expected symbol No %d: E", i); break; case op: GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Expected symbol No %d: op", i); break; case number: GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Expected symbol No %d: number", i); break; default: GENERICLOGGER_TRACEF(marpaWrapperRecognizerOption.genericLoggerp, "... Expected symbol No %d: ????", i); break; } } } } } /* Using normal valuation */ if (rci == 0) { marpaWrapperValuep = marpaWrapperValue_newp(marpaWrapperRecognizerp, &marpaWrapperValueOption); if (marpaWrapperValuep == NULL) { rci = 1; } } if (rci == 0) { valueContext.marpaWrapperValuep = marpaWrapperValuep; valueContext.marpaWrapperAsfValuep = NULL; while (marpaWrapperValue_valueb(marpaWrapperValuep, (void *) &valueContext, valueRuleCallback, valueSymbolCallback, NULL) > 0) { stackValueAndDescription_t *resultp = GENERICSTACK_GET_PTR(valueContext.outputStackp, 0); GENERICLOGGER_INFOF(valueContext.genericLoggerp, "[Value mode] %s => %d", resultp->s, resultp->i); } } if (marpaWrapperValuep != NULL) { marpaWrapperValue_freev(marpaWrapperValuep); } GENERICLOGGER_FREE(marpaWrapperValueOption.genericLoggerp); /* Using ASF valuation */ if (rci == 0) { marpaWrapperAsfValuep = marpaWrapperAsfValue_newp(marpaWrapperRecognizerp, &marpaWrapperAsfOption); if (marpaWrapperAsfValuep == NULL) { rci = 1; } } if (rci == 0) { valueContext.marpaWrapperValuep = NULL; valueContext.marpaWrapperAsfValuep = marpaWrapperAsfValuep; while (marpaWrapperAsfValue_valueb(marpaWrapperAsfValuep, (void *) &valueContext, okRuleCallback, okSymbolCallback, NULL, /* okNullingCallbackp */ valueRuleCallback, valueSymbolCallback, NULL /* nullingCallbackp */ ) > 0) { stackValueAndDescription_t *resultp = GENERICSTACK_GET_PTR(valueContext.outputStackp, 0); GENERICLOGGER_INFOF(valueContext.genericLoggerp, "[Asf value mode] %s => %d", resultp->s, resultp->i); } } if (marpaWrapperAsfValuep != NULL) { marpaWrapperAsfValue_freev(marpaWrapperAsfValuep); } GENERICLOGGER_FREE(marpaWrapperAsfOption.genericLoggerp); if (marpaWrapperRecognizerp != NULL) { marpaWrapperRecognizer_freev(marpaWrapperRecognizerp); } GENERICLOGGER_FREE(marpaWrapperRecognizerOption.genericLoggerp); if (marpaWrapperGrammarp != NULL) { marpaWrapperGrammar_freev(marpaWrapperGrammarp); } if (marpaWrapperGrammarOriginalp != NULL) { marpaWrapperGrammar_freev(marpaWrapperGrammarOriginalp); } GENERICLOGGER_FREE(marpaWrapperGrammarOption.genericLoggerp); GENERICLOGGER_FREE(valueContext.genericLoggerp); /* Input stack has no inner PTR */ GENERICSTACK_FREE(valueContext.inputStackp); /* Output stack have somme inner PTR */ outputStackSizei = GENERICSTACK_USED(valueContext.outputStackp); if (outputStackSizei > 0) { for (i = 0; i < outputStackSizei; i++) { if (GENERICSTACK_IS_PTR(valueContext.outputStackp, i)) { free(GENERICSTACK_GET_PTR(valueContext.outputStackp, i)); } } } GENERICSTACK_FREE(valueContext.outputStackp); exit(rci); }