END_TEST START_TEST (test_FormulaParser_getGoto) { int r; fail_unless( FormulaParser_getGoto( 0, 1) == 2, NULL ); fail_unless( FormulaParser_getGoto(14, 12) == 21, NULL ); fail_unless( FormulaParser_getGoto(14, 13) == 21, NULL ); fail_unless( FormulaParser_getGoto(14, 14) == 22, NULL ); fail_unless( FormulaParser_getGoto(14, 15) == 22, NULL ); for (r = 2; r < 12; r++) { fail_unless( FormulaParser_getGoto( 0, r) == 4, NULL ); fail_unless( FormulaParser_getGoto( 3, r) == 7, NULL ); fail_unless( FormulaParser_getGoto( 5, r) == 13, NULL ); fail_unless( FormulaParser_getGoto( 8, r) == 16, NULL ); fail_unless( FormulaParser_getGoto( 9, r) == 17, NULL ); fail_unless( FormulaParser_getGoto(10, r) == 18, NULL ); fail_unless( FormulaParser_getGoto(11, r) == 19, NULL ); fail_unless( FormulaParser_getGoto(12, r) == 20, NULL ); fail_unless( FormulaParser_getGoto(14, r) == 23, NULL ); fail_unless( FormulaParser_getGoto(25, r) == 26, NULL ); } }
/** * @if conly * @memberof ASTNode_t * @endif */ LIBSBML_EXTERN ASTNode_t * SBML_parseFormula (const char *formula) { long rule, state, action; ASTNode_t *node = NULL; FormulaTokenizer_t *tokenizer = NULL; Stack_t *stack = NULL; Token_t *token = NULL; if (formula == NULL) return NULL; tokenizer = FormulaTokenizer_createFromFormula(formula); token = FormulaTokenizer_nextToken(tokenizer); stack = Stack_create(20); Stack_push(stack, (void *) START_STATE); while (1) { state = (long) Stack_peek(stack); action = FormulaParser_getAction(state, token); if (action == ACCEPT_STATE) { node = Stack_peekAt(stack, 1); break; } else if (action == ERROR_STATE) { /** * Free ASTNodes on the Stack, skip the states. */ while (Stack_size(stack) > 1) { Stack_pop(stack); ASTNode_free( Stack_pop(stack) ); } node = NULL; break; } /** * Shift */ else if (action > 0) { Stack_push( stack, ASTNode_createFromToken(token) ); Stack_push( stack, (void *) action ); Token_free(token); token = FormulaTokenizer_nextToken(tokenizer); } /** * Reduce */ else if (action < 0) { rule = -action; node = FormulaParser_reduceStackByRule(stack, rule); state = (long) Stack_peek(stack); Stack_push( stack, node ); Stack_push( stack, (void *) FormulaParser_getGoto(state, rule) ); } } FormulaTokenizer_free(tokenizer); Stack_free(stack); Token_free(token); return node; }