Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
END_TEST

START_TEST (test_processNextProduction)
{
	errorCode err = EXIP_UNEXPECTED_ERROR;
	EXIStream strm;
	SmallIndex nonTermID_out;
	ContentHandler handler;
	EXIPSchema schema;
	QNameID emptyQnameID = {URI_MAX, LN_MAX};

	initAllocList(&strm.memList);
	initAllocList(&schema.memList);

	err = createDocGrammar(&schema, NULL, 0);
	fail_unless (err == EXIP_OK, "createDocGrammar returns an error code %d", err);

	err = pushGrammar(&strm.gStack, emptyQnameID, &schema.docGrammar);
	fail_unless (err == EXIP_OK, "pushGrammar returns an error code %d", err);

	strm.gStack->currNonTermID = 4;
	err = processNextProduction(&strm, &nonTermID_out, &handler, NULL);
	fail_unless (err == EXIP_INCONSISTENT_PROC_STATE, "processNextProduction does not return the correct error code");

	freeAllocList(&strm.memList);
	freeAllocList(&schema.memList);
}