Exemple #1
0
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);
}