/*
 * $id$
 *
 *  © Copyright IBM Corp. 2007
 *
 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE
 * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE
 * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT.
 *
 * You can obtain a current copy of the Eclipse Public License from
 * http://www.opensource.org/licenses/eclipse-1.0.php
 *
 * Author:       Sven Schuetz <sven@de.ibm.com>
 *
 * Description:
 *
 * CIM XML parser for sfcc to be used in connection with lexer cimXmlParser.c
 *
*/

#include "grammar.h"
#include "cimXmlParser.h"
#include "sfcUtil/utilft.h"
#include "parserUtil.h"


static int ct = 0;
static int dontLex = 0;


static void parseError(char* tokExp, int tokFound, ParserControl *parm)
{
	printf("Parse error. Expected token(s) %s, found tag number %d (see cimXmlParser.h) and following xml: %.255s...\nAborting.\n", tokExp, tokFound, parm->xmb->cur+1);
	exit(0);
}


static int localLex(parseUnion *lvalp, ParserControl *parm)
{
    if(! dontLex) {
        ct = sfccLex(lvalp, parm);
    }
    else {
        dontLex = 0;
        return ct;
    }
    return ct;
}


void startParsing(ParserControl *parm)
{
    parseUnion stateUnion;
    start(parm, &stateUnion);
}

static void start(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex(stateUnion, parm);
	if(ct == XTOK_XML) {
		ct = localLex(stateUnion, parm);
		if(ct == ZTOK_XML) {
			cim(parm, stateUnion);
		}
		else {
			parseError("ZTOK_XML", ct, parm);
		}
	}
	else {
		parseError("XTOK_XML", ct, parm);
	}
}

static void cim(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex(stateUnion, parm);
	if(ct == XTOK_CIM) {
		message(parm, (parseUnion*)&stateUnion->xtokMessage);
		ct = localLex(stateUnion, parm);
		if(ct == ZTOK_CIM) {
		}
		else {
			parseError("ZTOK_CIM", ct, parm);
		}
	}
	else {
		parseError("XTOK_CIM", ct, parm);
	}
}

static void message(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokMessage, parm);
	if(ct == XTOK_MESSAGE) {
		messageContent(parm, stateUnion);
		ct = localLex((parseUnion*)&stateUnion->xtokMessage, parm);
		if(ct == ZTOK_MESSAGE) {
		}
		else {
			parseError("ZTOK_MESSAGE", ct, parm);
		}
	}
	else {
		parseError("XTOK_MESSAGE", ct, parm);
	}
}

static void messageContent(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex(stateUnion, parm);
	if(ct == XTOK_SIMPLERSP) {
		simpleRspContent(parm, (parseUnion*)&stateUnion->xtokSimpleRespContent);
		ct = localLex(stateUnion, parm);
		if(ct == ZTOK_SIMPLERSP) {
		}
		else {
			parseError("ZTOK_SIMPLERSP", ct, parm);
		}
	}
	else if(ct == XTOK_SIMPLEEXPREQ) {
		exportIndication(parm, stateUnion);
		ct = localLex(stateUnion, parm);
		if(ct == ZTOK_SIMPLEEXPREQ) {
		}
		else {
			parseError("ZTOK_SIMPLEEXPREQ", ct, parm);
		}
	}
	else {
		parseError("XTOK_SIMPLERSP", ct, parm);
	}
}

static void simpleRspContent(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokSimpleRespContent, parm);
	if(ct == XTOK_METHODRESP) {
		methodRespContent(parm, (parseUnion*)&stateUnion->xtokSimpleRespContent.resp);
		setReturnArgs(parm, &stateUnion->xtokSimpleRespContent.resp.values);
		ct = localLex((parseUnion*)&stateUnion->xtokSimpleRespContent, parm);
		if(ct == ZTOK_METHODRESP) {
		}
		else {
			parseError("ZTOK_METHODRESP", ct, parm);
		}
	}
	else if(ct == XTOK_IMETHODRESP) {
		iMethodRespContent(parm, stateUnion);
		ct = localLex((parseUnion*)&stateUnion->xtokSimpleRespContent, parm);
		if(ct == ZTOK_IMETHODRESP) {
		}
		else {
			parseError("ZTOK_IMETHODRESP", ct, parm);
		}
	}
	else {
		parseError("XTOK_METHODRESP", ct, parm);
	}
}

static void exportIndication(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex(stateUnion, parm);
	if(ct == XTOK_EXPORTINDICATION) {
		exParamValue(parm, stateUnion);
		ct = localLex(stateUnion, parm);
		if(ct == ZTOK_EXPMETHODCALL) {
		}
		else {
			parseError("ZTOK_EXPMETHODCALL", ct, parm);
		}
	}
	else {
		parseError("XTOK_EXPORTINDICATION", ct, parm);
	}
}

static void exParamValue(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp = {0};
	CMPIInstance *inst;
	ct = localLex(stateUnion, parm);
	if(ct == XTOK_EP_INSTANCE) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_INSTANCE) {
			dontLex = 1;
			instance(parm, (parseUnion*)&lvalp.xtokInstance);
			inst = native_new_CMPIInstance(NULL,NULL);
			setInstNsAndCn(inst,getNameSpaceChars(parm->requestObjectPath),lvalp.xtokInstance.className);
			setInstProperties(inst, &lvalp.xtokInstance.properties);
			simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&inst,CMPI_instance);
		}
		ct = localLex(stateUnion, parm);
		if(ct == ZTOK_EXPPARAMVALUE) {
		}
		else {
			parseError("ZTOK_EXPPARAMVALUE or XTOK_INSTANCE", ct, parm);
		}
	}
	else {
		parseError("XTOK_EP_INSTANCE", ct, parm);
	}
}

static void methodRespContent(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex(&lvalp, parm);
	if(ct == XTOK_ERROR) {
		dontLex = 1;
		error(parm, (parseUnion*)&lvalp.xtokErrorResp);
	}
	else if(ct == XTOK_RETVALUE || ct == XTOK_PARAMVALUE) {
		dontLex = 1;
		if(ct == XTOK_RETVALUE) {
			dontLex = 1;
			returnValue(parm, (parseUnion*)&lvalp.xtokReturnValue);
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_PARAMVALUE) {
			do {
				dontLex = 1;
				paramValue(parm, (parseUnion*)&lvalp.xtokParamValue);
				addParamValue(parm, &stateUnion->xtokMethodRespContent.values, &lvalp.xtokParamValue);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_PARAMVALUE);
			dontLex = 1;
		}
	}
	else if(ct == ZTOK_METHODRESP) {
		dontLex = 1;
	}
	else {
		parseError("XTOK_ERROR or XTOK_RETVALUE or XTOK_PARAMVALUE or ZTOK_METHODRESP", ct, parm);
	}
}

static void iMethodRespContent(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex(&lvalp, parm);
	if(ct == XTOK_ERROR) {
		dontLex = 1;
		error(parm, (parseUnion*)&lvalp.xtokErrorResp);
	}
	else if(ct == XTOK_IRETVALUE) {
		dontLex = 1;
		iReturnValue(parm, stateUnion);
	}
	else {
		parseError("XTOK_ERROR or XTOK_IRETVALUE", ct, parm);
	}
}

static void error(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokErrorResp, parm);
	if(ct == XTOK_ERROR) {
		setError(parm, &stateUnion->xtokErrorResp);
		ct = localLex((parseUnion*)&stateUnion->xtokErrorResp, parm);
		if(ct == ZTOK_ERROR) {
		}
		else {
			parseError("ZTOK_ERROR", ct, parm);
		}
	}
	else {
		parseError("XTOK_ERROR", ct, parm);
	}
}

static void returnValue(ParserControl *parm, parseUnion *stateUnion)
{
	CMPIType  t;
	CMPIValue val;
	CMPIInstance *inst;
	ct = localLex((parseUnion*)&stateUnion->xtokReturnValue, parm);
	if(ct == XTOK_RETVALUE) {
		returnValueData(parm, (parseUnion*)&stateUnion->xtokReturnValue.data);
		if(stateUnion->xtokReturnValue.data.type == CMPI_ref) {
			t = CMPI_ref;
			val = str2CMPIValue(t, NULL, &stateUnion->xtokReturnValue.data.ref);
		}
		else if(stateUnion->xtokReturnValue.data.value.type == typeValue_Instance) {
			t = CMPI_instance;
			inst = native_new_CMPIInstance(NULL,NULL);
			setInstNsAndCn(inst,getNameSpaceChars(parm->requestObjectPath),stateUnion->xtokReturnValue.data.value.data.inst->className);
			setInstProperties(inst, &stateUnion->xtokReturnValue.data.value.data.inst->properties);
			val.inst = inst;
		}
		else {
			t = stateUnion->xtokReturnValue.type;
			if (t == CMPI_null) {
				t = guessType(stateUnion->xtokReturnValue.data.value.data.value);
			}
			val = str2CMPIValue(t, stateUnion->xtokReturnValue.data.value.data.value, NULL);
		}
		simpleArrayAdd(parm->respHdr.rvArray, (CMPIValue*)&val, t);
		ct = localLex((parseUnion*)&stateUnion->xtokReturnValue, parm);
		if(ct == ZTOK_RETVALUE) {
		}
		else {
			parseError("ZTOK_RETVALUE", ct, parm);
		}
	}
	else {
		parseError("XTOK_RETVALUE", ct, parm);
	}
}

static void returnValueData(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokReturnValueData, parm);
	if(ct == XTOK_VALUE) {
		dontLex = 1;
		value(parm, (parseUnion*)&stateUnion->xtokReturnValueData.value);
	}
	else if(ct == XTOK_VALUEREFERENCE) {
		dontLex = 1;
		valueReference(parm, (parseUnion*)&stateUnion->xtokReturnValueData.ref);
		stateUnion->xtokReturnValueData.type = CMPI_ref;
	}
	else {
		parseError("XTOK_VALUE or XTOK_VALUEREFERENCE", ct, parm);
	}
}

static void paramValue(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokParamValue, parm);
	if(ct == XTOK_PARAMVALUE) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_VALUE || ct == XTOK_VALUEREFERENCE || ct == XTOK_VALUEARRAY || ct == XTOK_VALUEREFARRAY) {
			dontLex = 1;
			paramValueData(parm, (parseUnion*)&lvalp.xtokParamValueData);
			stateUnion->xtokParamValue.data = lvalp.xtokParamValueData;
			if(lvalp.xtokParamValueData.type == CMPI_instance) {
				stateUnion->xtokParamValue.type = CMPI_instance;
			}
			else {
				stateUnion->xtokParamValue.type |= lvalp.xtokParamValueData.type;
			}
		}
		ct = localLex((parseUnion*)&stateUnion->xtokParamValue, parm);
		if(ct == ZTOK_PARAMVALUE) {
		}
		else {
			parseError("ZTOK_PARAMVALUE or XTOK_VALUE or XTOK_VALUEREFERENCE or XTOK_VALUEARRAY or XTOK_VALUEREFARRAY", ct, parm);
		}
	}
	else {
		parseError("XTOK_PARAMVALUE", ct, parm);
	}
}

static void paramValueData(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokParamValueData, parm);
	if(ct == XTOK_VALUE) {
		dontLex = 1;
		value(parm, (parseUnion*)&stateUnion->xtokParamValueData.value);
		if(stateUnion->xtokParamValueData.value.type == typeValue_Instance) {
			stateUnion->xtokParamValueData.type = CMPI_instance;
		}
	}
	else if(ct == XTOK_VALUEREFERENCE) {
		dontLex = 1;
		valueReference(parm, (parseUnion*)&stateUnion->xtokParamValueData.valueRef);
		stateUnion->xtokParamValueData.type = CMPI_ref;
	}
	else if(ct == XTOK_VALUEARRAY) {
		dontLex = 1;
		valueArray(parm, (parseUnion*)&stateUnion->xtokParamValueData.valueArray);
		stateUnion->xtokParamValueData.type |= CMPI_ARRAY;
	}
	else if(ct == XTOK_VALUEREFARRAY) {
		dontLex = 1;
		valueRefArray(parm, (parseUnion*)&stateUnion->xtokParamValueData.valueRefArray);
		stateUnion->xtokParamValueData.type = CMPI_refA;
	}
	else {
		parseError("XTOK_VALUE or XTOK_VALUEREFERENCE or XTOK_VALUEARRAY or XTOK_VALUEREFARRAY", ct, parm);
	}
}

static void iReturnValue(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex(stateUnion, parm);
	if(ct == XTOK_IRETVALUE) {
		iReturnValueContent(parm, stateUnion);
		ct = localLex(stateUnion, parm);
		if(ct == ZTOK_IRETVALUE) {
		}
		else {
			parseError("ZTOK_IRETVALUE", ct, parm);
		}
	}
	else {
		parseError("XTOK_IRETVALUE", ct, parm);
	}
}

static void iReturnValueContent(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp ={0};
	CMPIObjectPath *op;
	CMPIInstance *inst;
	CMPIConstClass *cls;
	ct = localLex(&lvalp, parm);
	dontLex = 1;
	if(ct == XTOK_CLASS) {
		do {
			dontLex = 1;
			class(parm, (parseUnion*)&lvalp.xtokClass);
			cls = native_new_CMPIConstClass(lvalp.xtokClass.className,NULL);
			setClassQualifiers(cls, &lvalp.xtokClass.qualifiers);
			setClassProperties(cls, &lvalp.xtokClass.properties);
			setClassMethods(cls, &lvalp.xtokClass.methods);
			simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&cls,CMPI_class);
			ct = localLex(&lvalp, parm);
		}
		while(ct == XTOK_CLASS);
		dontLex = 1;
	}
	else if(ct == XTOK_CLASSNAME) {
		do {
			dontLex = 1;
			className(parm, (parseUnion*)&lvalp.xtokClassName);
			op = newCMPIObjectPath(NULL, lvalp.xtokClassName.value, NULL);
			simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&op,CMPI_ref);
			ct = localLex(&lvalp, parm);
		}
		while(ct == XTOK_CLASSNAME);
		dontLex = 1;
	}
	else if(ct == XTOK_INSTANCE) {
		do {
			dontLex = 1;
			instance(parm, (parseUnion*)&lvalp.xtokInstance);
			inst = native_new_CMPIInstance(parm->requestObjectPath,NULL);
			setInstProperties(inst, &lvalp.xtokInstance.properties);
			simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&inst,CMPI_instance);
			ct = localLex(&lvalp, parm);
		}
		while(ct == XTOK_INSTANCE);
		dontLex = 1;
	}
	else if(ct == XTOK_INSTANCENAME) {
		do {
			dontLex = 1;
			instanceName(parm, (parseUnion*)&lvalp.xtokInstanceName);
			createPath(&op, &lvalp.xtokInstanceName);
			simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&op,CMPI_ref);
			ct = localLex(&lvalp, parm);
		}
		while(ct == XTOK_INSTANCENAME);
		dontLex = 1;
	}
	else if(ct == XTOK_VALUENAMEDINSTANCE) {
		do {
			dontLex = 1;
			valueNamedInstance(parm, (parseUnion*)&lvalp.xtokNamedInstance);
			createPath(&op,&(lvalp.xtokNamedInstance.path));
			CMSetNameSpace(op, getNameSpaceChars(parm->requestObjectPath));
			inst = native_new_CMPIInstance(op,NULL);
			op->ft->release(op);
			//setInstQualifiers(inst, &lvalp.xtokNamedInstance.instance.qualifiers);
			setInstProperties(inst, &lvalp.xtokNamedInstance.instance.properties);
			simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&inst,CMPI_instance);
			ct = localLex(&lvalp, parm);
		}
		while(ct == XTOK_VALUENAMEDINSTANCE);
		dontLex = 1;
	}
	else if(ct == XTOK_OBJECTPATH) {
		do {
			dontLex = 1;
			objectPath(parm, (parseUnion*)&lvalp.xtokObjectPath);
			createPath(&op, &lvalp.xtokObjectPath.path.instanceName);
			CMSetNameSpace(op, lvalp.xtokObjectPath.path.path.nameSpacePath.value);
			CMSetHostname(op, lvalp.xtokObjectPath.path.path.host.host);
			simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&op,CMPI_ref);
			ct = localLex(&lvalp, parm);
		}
		while(ct == XTOK_OBJECTPATH);
		dontLex = 1;
	}
	else if(ct == XTOK_VALUEOBJECTWITHPATH) {
		do {
			dontLex = 1;
			valueObjectWithPath(parm, (parseUnion*)&lvalp.xtokObjectWithPath);
			ct = localLex(&lvalp, parm);
		}
		while(ct == XTOK_VALUEOBJECTWITHPATH);
		dontLex = 1;
	}
	else if(ct == XTOK_VALUE || ct == XTOK_VALUEARRAY || ct == XTOK_VALUEREFERENCE) {
		dontLex = 1;
		if(ct == XTOK_VALUE || ct == XTOK_VALUEARRAY || ct == XTOK_VALUEREFERENCE) {
			dontLex = 1;
			getPropertyRetValue(parm, (parseUnion*)&lvalp.xtokGetPropRetContent);
		}
	}
	else if(ct == ZTOK_IRETVALUE) {
		dontLex = 1;
	}
	else {
		parseError("XTOK_CLASS or XTOK_CLASSNAME or XTOK_INSTANCE or XTOK_INSTANCENAME or XTOK_VALUENAMEDINSTANCE or XTOK_OBJECTPATH or XTOK_VALUEOBJECTWITHPATH or XTOK_VALUE or ZTOK_IRETVALUE", ct, parm);
	}
}

static void getPropertyRetValue(ParserControl *parm, parseUnion *stateUnion)
{
	CMPIType  t;
	CMPIValue val;
	ct = localLex((parseUnion*)&stateUnion->xtokGetPropRetContent, parm);
	if(ct == XTOK_VALUE) {
		dontLex = 1;
		value(parm, (parseUnion*)&stateUnion->xtokGetPropRetContent.value);
		t   = guessType(stateUnion->xtokGetPropRetContent.value.data.value);
		val = str2CMPIValue(t, stateUnion->xtokGetPropRetContent.value.data.value, NULL);
		simpleArrayAdd(parm->respHdr.rvArray, (CMPIValue*)&val, t);
	}
	else if(ct == XTOK_VALUEARRAY) {
		dontLex = 1;
		valueArray(parm, (parseUnion*)&stateUnion->xtokGetPropRetContent.arr);
	}
	else if(ct == XTOK_VALUEREFERENCE) {
		dontLex = 1;
		valueReference(parm, (parseUnion*)&stateUnion->xtokGetPropRetContent.ref);
	}
	else {
		parseError("XTOK_VALUE or XTOK_VALUEARRAY or XTOK_VALUEREFERENCE", ct, parm);
	}
}

static void valueObjectWithPath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokObjectWithPath, parm);
	if(ct == XTOK_VALUEOBJECTWITHPATH) {
		valueObjectWithPathData(parm, (parseUnion*)&stateUnion->xtokObjectWithPath.object);
		stateUnion->xtokObjectWithPath.type = stateUnion->xtokObjectWithPath.object.type;
		ct = localLex((parseUnion*)&stateUnion->xtokObjectWithPath, parm);
		if(ct == ZTOK_VALUEOBJECTWITHPATH) {
		}
		else {
			parseError("ZTOK_VALUEOBJECTWITHPATH", ct, parm);
		}
	}
	else {
		parseError("XTOK_VALUEOBJECTWITHPATH", ct, parm);
	}
}

static void valueObjectWithPathData(ParserControl *parm, parseUnion *stateUnion)
{
	CMPIObjectPath *op = NULL;
	CMPIInstance *inst;
	ct = localLex((parseUnion*)&stateUnion->xtokObjectWithPathData, parm);
	if(ct == XTOK_CLASSPATH) {
		dontLex = 1;
		classWithPath(parm, (parseUnion*)&stateUnion->xtokObjectWithPathData.cls);
		stateUnion->xtokObjectWithPathData.type = 1;
	}
	else if(ct == XTOK_INSTANCEPATH) {
		dontLex = 1;
		instanceWithPath(parm, (parseUnion*)&stateUnion->xtokObjectWithPathData.inst);
		stateUnion->xtokObjectWithPathData.type = 0;
		createPath(&op, &stateUnion->xtokObjectWithPathData.inst.path.instanceName);
		CMSetNameSpace(op, stateUnion->xtokObjectWithPathData.inst.path.path.nameSpacePath.value);
		CMSetHostname(op, stateUnion->xtokObjectWithPathData.inst.path.path.host.host);
		inst = native_new_CMPIInstance(op,NULL);
		setInstQualifiers(inst, &stateUnion->xtokObjectWithPathData.inst.inst.qualifiers);
		setInstProperties(inst, &stateUnion->xtokObjectWithPathData.inst.inst.properties);
		simpleArrayAdd(parm->respHdr.rvArray,(CMPIValue*)&inst,CMPI_instance);
		if (op) op->ft->release(op);
	}
	else {
		parseError("XTOK_CLASSPATH or XTOK_INSTANCEPATH", ct, parm);
	}
}

static void classWithPath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokClassWithPath, parm);
	if(ct == XTOK_CLASSPATH) {
		dontLex = 1;
		classPath(parm, (parseUnion*)&stateUnion->xtokClassWithPath.path);
		class(parm, (parseUnion*)&stateUnion->xtokClassWithPath.cls);
	}
	else {
		parseError("XTOK_CLASSPATH or XTOK_CLASS", ct, parm);
	}
}

static void instanceWithPath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokInstanceWithPath, parm);
	if(ct == XTOK_INSTANCEPATH) {
		dontLex = 1;
		instancePath(parm, (parseUnion*)&stateUnion->xtokInstanceWithPath.path);
		instance(parm, (parseUnion*)&stateUnion->xtokInstanceWithPath.inst);
	}
	else {
		parseError("XTOK_INSTANCEPATH or XTOK_INSTANCE", ct, parm);
	}
}

static void class(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokClass, parm);
	if(ct == XTOK_CLASS) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				addQualifier(parm,&stateUnion->xtokClass.qualifiers,&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_PROPERTY || ct == XTOK_PROPERTYARRAY || ct == XTOK_PROPERTYREFERENCE) {
			do {
				dontLex = 1;
				genProperty(parm, (parseUnion*)&lvalp.xtokProperty);
				addProperty(parm,&stateUnion->xtokClass.properties,&lvalp.xtokProperty);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_PROPERTY || ct == XTOK_PROPERTYARRAY || ct == XTOK_PROPERTYREFERENCE);
			dontLex = 1;
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_METHOD) {
			do {
				dontLex = 1;
				method(parm, (parseUnion*)&lvalp.xtokMethod);
				addMethod(parm,&stateUnion->xtokClass.methods,&lvalp.xtokMethod);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_METHOD);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokClass, parm);
		if(ct == ZTOK_CLASS) {
		}
		else {
			parseError("ZTOK_CLASS or XTOK_METHOD or XTOK_PROPERTY or XTOK_PROPERTYARRAY or XTOK_PROPERTYREFERENCE or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_CLASS", ct, parm);
	}
}

static void method(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokMethod, parm);
	if(ct == XTOK_METHOD) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				addQualifier(parm,&stateUnion->xtokMethod.qualifiers,&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_PARAM || ct == XTOK_PARAMREF || ct == XTOK_PARAMARRAY || ct == XTOK_PARAMREFARRAY) {
			do {
				dontLex = 1;
				methodData(parm, (parseUnion*)&lvalp.xtokMethodData);
				addParam(parm,&stateUnion->xtokMethod.params,&lvalp.xtokParam);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_PARAM || ct == XTOK_PARAMREF || ct == XTOK_PARAMARRAY || ct == XTOK_PARAMREFARRAY);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokMethod, parm);
		if(ct == ZTOK_METHOD) {
		}
		else {
			parseError("ZTOK_METHOD or XTOK_PARAM or XTOK_PARAMREF or XTOK_PARAMARRAY or XTOK_PARAMREFARRAY or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_METHOD", ct, parm);
	}
}

static void methodData(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	if(ct == XTOK_PARAM) {
		dontLex = 1;
		if(ct == XTOK_PARAM) {
			dontLex = 1;
			parameter(parm, (parseUnion*)&lvalp.xtokParam);
		}
	}
	else if(ct == XTOK_PARAMREF) {
		dontLex = 1;
		if(ct == XTOK_PARAMREF) {
			dontLex = 1;
			parameterReference(parm, (parseUnion*)&lvalp.xtokParam);
		}
	}
	else if(ct == XTOK_PARAMARRAY) {
		dontLex = 1;
		if(ct == XTOK_PARAMARRAY) {
			dontLex = 1;
			parameterArray(parm, (parseUnion*)&lvalp.xtokParam);
		}
	}
	else if(ct == XTOK_PARAMREFARRAY) {
		dontLex = 1;
		if(ct == XTOK_PARAMREFARRAY) {
			dontLex = 1;
			parameterRefArray(parm, (parseUnion*)&lvalp.xtokParam);
		}
	}
	else {
		parseError("XTOK_PARAM or XTOK_PARAMREF or XTOK_PARAMARRAY or XTOK_PARAMREFARRAY", ct, parm);
	}
}

static void parameter(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
	if(ct == XTOK_PARAM) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
		if(ct == ZTOK_PARAM) {
		}
		else {
			parseError("ZTOK_PARAM or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_PARAM", ct, parm);
	}
}

static void parameterReference(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
	if(ct == XTOK_PARAMREF) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
		if(ct == ZTOK_PARAMREF) {
		}
		else {
			parseError("ZTOK_PARAMREF or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_PARAMREF", ct, parm);
	}
}

static void parameterRefArray(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
	if(ct == XTOK_PARAMREFARRAY) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
		if(ct == ZTOK_PARAMREFARRAY) {
		}
		else {
			parseError("ZTOK_PARAMREFARRAY or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_PARAMREFARRAY", ct, parm);
	}
}

static void parameterArray(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
	if(ct == XTOK_PARAMARRAY) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokParam, parm);
		if(ct == ZTOK_PARAMARRAY) {
		}
		else {
			parseError("ZTOK_PARAMARRAY or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_PARAMARRAY", ct, parm);
	}
}

static void objectPath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokObjectPath, parm);
	if(ct == XTOK_OBJECTPATH) {
		instancePath(parm, (parseUnion*)&stateUnion->xtokObjectPath.path);
		ct = localLex((parseUnion*)&stateUnion->xtokObjectPath, parm);
		if(ct == ZTOK_OBJECTPATH) {
		}
		else {
			parseError("ZTOK_OBJECTPATH", ct, parm);
		}
	}
	else {
		parseError("XTOK_OBJECTPATH", ct, parm);
	}
}

static void classPath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokClassPath, parm);
	if(ct == XTOK_CLASSPATH) {
		nameSpacePath(parm, (parseUnion*)&stateUnion->xtokClassPath.name);
		className(parm, (parseUnion*)&stateUnion->xtokClassPath.className);
		ct = localLex((parseUnion*)&stateUnion->xtokClassPath, parm);
		if(ct == ZTOK_CLASSPATH) {
		}
		else {
			parseError("ZTOK_CLASSPATH", ct, parm);
		}
	}
	else {
		parseError("XTOK_CLASSPATH", ct, parm);
	}
}

static void className(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokClassName, parm);
	if(ct == XTOK_CLASSNAME) {
		ct = localLex((parseUnion*)&stateUnion->xtokClassName, parm);
		if(ct == ZTOK_CLASSNAME) {
		}
		else {
			parseError("ZTOK_CLASSNAME", ct, parm);
		}
	}
	else {
		parseError("XTOK_CLASSNAME", ct, parm);
	}
}

static void instancePath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokInstancePath, parm);
	if(ct == XTOK_INSTANCEPATH) {
		nameSpacePath(parm, (parseUnion*)&stateUnion->xtokInstancePath.path);
		instanceName(parm, (parseUnion*)&stateUnion->xtokInstancePath.instanceName);
		ct = localLex((parseUnion*)&stateUnion->xtokInstancePath, parm);
		if(ct == ZTOK_INSTANCEPATH) {
		}
		else {
			parseError("ZTOK_INSTANCEPATH", ct, parm);
		}
	}
	else {
		parseError("XTOK_INSTANCEPATH", ct, parm);
	}
}

static void localInstancePath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokLocalInstancePath, parm);
	if(ct == XTOK_LOCALINSTANCEPATH) {
		localNameSpacePath(parm, (parseUnion*)&stateUnion->xtokLocalInstancePath.path);
		instanceName(parm, (parseUnion*)&stateUnion->xtokLocalInstancePath.instanceName);
		ct = localLex((parseUnion*)&stateUnion->xtokLocalInstancePath, parm);
		if(ct == ZTOK_LOCALINSTANCEPATH) {
		}
		else {
			parseError("ZTOK_LOCALINSTANCEPATH", ct, parm);
		}
	}
	else {
		parseError("XTOK_LOCALINSTANCEPATH", ct, parm);
	}
}

static void nameSpacePath(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokNameSpacePath, parm);
	if(ct == XTOK_NAMESPACEPATH) {
		host(parm, (parseUnion*)&stateUnion->xtokNameSpacePath.host);
		localNameSpacePath(parm, (parseUnion*)&stateUnion->xtokNameSpacePath.nameSpacePath);
		ct = localLex((parseUnion*)&stateUnion->xtokNameSpacePath, parm);
		if(ct == ZTOK_NAMESPACEPATH) {
		}
		else {
			parseError("ZTOK_NAMESPACEPATH", ct, parm);
		}
	}
	else {
		parseError("XTOK_NAMESPACEPATH", ct, parm);
	}
}

static void host(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokHost, parm);
	if(ct == XTOK_HOST) {
		ct = localLex((parseUnion*)&stateUnion->xtokHost, parm);
		if(ct == ZTOK_HOST) {
		}
		else {
			parseError("ZTOK_HOST", ct, parm);
		}
	}
	else {
		parseError("XTOK_HOST", ct, parm);
	}
}

static void localNameSpacePath(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokLocalNameSpacePath, parm);
	if(ct == XTOK_LOCALNAMESPACEPATH) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_NAMESPACE) {
			do {
				dontLex = 1;
				nameSpace(parm, (parseUnion*)&lvalp.xtokNameSpace);
				if(stateUnion->xtokLocalNameSpacePath.value) {
					stateUnion->xtokLocalNameSpacePath.value = parser_realloc(parm->heap, stateUnion->xtokLocalNameSpacePath.value, strlen(stateUnion->xtokLocalNameSpacePath.value) + strlen(lvalp.xtokNameSpace.ns) + 2);
					strcat(stateUnion->xtokLocalNameSpacePath.value, "/");
					strcat(stateUnion->xtokLocalNameSpacePath.value, lvalp.xtokNameSpace.ns);
				}
				else {
					stateUnion->xtokLocalNameSpacePath.value = parser_malloc(parm->heap, strlen(lvalp.xtokNameSpace.ns) + 1);
					strcpy(stateUnion->xtokLocalNameSpacePath.value, lvalp.xtokNameSpace.ns);
				}
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_NAMESPACE);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokLocalNameSpacePath, parm);
		if(ct == ZTOK_LOCALNAMESPACEPATH) {
		}
		else {
			parseError("ZTOK_LOCALNAMESPACEPATH or XTOK_NAMESPACE", ct, parm);
		}
	}
	else {
		parseError("XTOK_LOCALNAMESPACEPATH", ct, parm);
	}
}

static void nameSpace(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokNameSpace, parm);
	if(ct == XTOK_NAMESPACE) {
		ct = localLex((parseUnion*)&stateUnion->xtokNameSpace, parm);
		if(ct == ZTOK_NAMESPACE) {
		}
		else {
			parseError("ZTOK_NAMESPACE", ct, parm);
		}
	}
	else {
		parseError("XTOK_NAMESPACE", ct, parm);
	}
}

static void valueNamedInstance(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokNamedInstance, parm);
	if(ct == XTOK_VALUENAMEDINSTANCE) {
		instanceName(parm, (parseUnion*)&stateUnion->xtokNamedInstance.path);
		instance(parm, (parseUnion*)&stateUnion->xtokNamedInstance.instance);
		ct = localLex((parseUnion*)&stateUnion->xtokNamedInstance, parm);
		if(ct == ZTOK_VALUENAMEDINSTANCE) {
		}
		else {
			parseError("ZTOK_VALUENAMEDINSTANCE", ct, parm);
		}
	}
	else {
		parseError("XTOK_VALUENAMEDINSTANCE", ct, parm);
	}
}

static void instance(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokInstance, parm);
	if(ct == XTOK_INSTANCE) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				addQualifier(parm,&stateUnion->xtokInstance.qualifiers,&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_PROPERTY || ct == XTOK_PROPERTYARRAY || ct == XTOK_PROPERTYREFERENCE) {
			do {
				dontLex = 1;
				genProperty(parm, (parseUnion*)&lvalp.xtokProperty);
				addProperty(parm,&stateUnion->xtokInstance.properties,&lvalp.xtokProperty);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_PROPERTY || ct == XTOK_PROPERTYARRAY || ct == XTOK_PROPERTYREFERENCE);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokInstance, parm);
		if(ct == ZTOK_INSTANCE) {
		}
		else {
			parseError("ZTOK_INSTANCE or XTOK_PROPERTY or XTOK_PROPERTYARRAY or XTOK_PROPERTYREFERENCE or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_INSTANCE", ct, parm);
	}
}

static void genProperty(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokProperty, parm);
	if(ct == XTOK_PROPERTY) {
		dontLex = 1;
		property(parm, (parseUnion*)&stateUnion->xtokProperty.val);
		if(stateUnion->xtokProperty.val.value.type == typeValue_Instance) {
			stateUnion->xtokProperty.valueType = CMPI_instance;
		}
	}
	else if(ct == XTOK_PROPERTYARRAY) {
		dontLex = 1;
		propertyArray(parm, (parseUnion*)&stateUnion->xtokProperty.val);
	}
	else if(ct == XTOK_PROPERTYREFERENCE) {
		dontLex = 1;
		propertyReference(parm, (parseUnion*)&stateUnion->xtokProperty.val);
	}
	else {
		parseError("XTOK_PROPERTY or XTOK_PROPERTYARRAY or XTOK_PROPERTYREFERENCE", ct, parm);
	}
}

static void qualifier(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokQualifier, parm);
	if(ct == XTOK_QUALIFIER) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_VALUE || ct == XTOK_VALUEARRAY) {
			dontLex = 1;
			qualifierData(parm, (parseUnion*)&lvalp.xtokQualifierData);
			stateUnion->xtokQualifier.data = lvalp.xtokQualifierData;
			if(lvalp.xtokQualifierData.isArray) {
				stateUnion->xtokQualifier.type |= CMPI_ARRAY;
			}
		}
		ct = localLex((parseUnion*)&stateUnion->xtokQualifier, parm);
		if(ct == ZTOK_QUALIFIER) {
		}
		else {
			parseError("ZTOK_QUALIFIER or XTOK_VALUE or XTOK_VALUEARRAY", ct, parm);
		}
	}
	else {
		parseError("XTOK_QUALIFIER", ct, parm);
	}
}

static void qualifierData(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokQualifierData, parm);
	if(ct == XTOK_VALUE) {
		dontLex = 1;
		value(parm, (parseUnion*)&stateUnion->xtokQualifierData.value);
		stateUnion->xtokQualifierData.isArray = 0;
	}
	else if(ct == XTOK_VALUEARRAY) {
		dontLex = 1;
		valueArray(parm, (parseUnion*)&stateUnion->xtokQualifierData.array);
		stateUnion->xtokQualifierData.isArray = 1;
	}
	else {
		parseError("XTOK_VALUE or XTOK_VALUEARRAY", ct, parm);
	}
}

static void property(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokPropertyData, parm);
	if(ct == XTOK_PROPERTY) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				addQualifier(parm,&stateUnion->xtokPropertyData.qualifiers,&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_VALUE) {
			dontLex = 1;
			value(parm, (parseUnion*)&lvalp.xtokValue);
			stateUnion->xtokPropertyData.value = lvalp.xtokValue;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokPropertyData, parm);
		if(ct == ZTOK_PROPERTY) {
		}
		else {
			parseError("ZTOK_PROPERTY or XTOK_VALUE or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_PROPERTY", ct, parm);
	}
}

static void propertyArray(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokPropertyData, parm);
	if(ct == XTOK_PROPERTYARRAY) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				addQualifier(parm,&stateUnion->xtokPropertyData.qualifiers,&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_VALUEARRAY) {
			dontLex = 1;
			valueArray(parm, (parseUnion*)&lvalp.xtokValueArray);
			stateUnion->xtokPropertyData.array = lvalp.xtokValueArray;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokPropertyData, parm);
		if(ct == ZTOK_PROPERTYARRAY) {
		}
		else {
			parseError("ZTOK_PROPERTYARRAY or XTOK_VALUEARRAY or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_PROPERTYARRAY", ct, parm);
	}
}

static void propertyReference(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokPropertyData, parm);
	if(ct == XTOK_PROPERTYREFERENCE) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_QUALIFIER) {
			do {
				dontLex = 1;
				qualifier(parm, (parseUnion*)&lvalp.xtokQualifier);
				addQualifier(parm,&stateUnion->xtokPropertyData.qualifiers,&lvalp.xtokQualifier);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_QUALIFIER);
			dontLex = 1;
		}
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_VALUEREFERENCE) {
			dontLex = 1;
			valueReference(parm, (parseUnion*)&lvalp.xtokValueReference);
			stateUnion->xtokPropertyData.ref = lvalp.xtokValueReference;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokPropertyData, parm);
		if(ct == ZTOK_PROPERTYREFERENCE) {
		}
		else {
			parseError("ZTOK_PROPERTYREFERENCE or XTOK_VALUEREFERENCE or XTOK_QUALIFIER", ct, parm);
		}
	}
	else {
		parseError("XTOK_PROPERTYREFERENCE", ct, parm);
	}
}

static void instanceName(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokInstanceName, parm);
	if(ct == XTOK_INSTANCENAME) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_KEYBINDING) {
			do {
				dontLex = 1;
				keyBinding(parm, (parseUnion*)&lvalp.xtokKeyBinding);
				addKeyBinding(parm, &stateUnion->xtokInstanceName.bindings, &lvalp.xtokKeyBinding);
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_KEYBINDING);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokInstanceName, parm);
		if(ct == ZTOK_INSTANCENAME) {
		}
		else {
			parseError("ZTOK_INSTANCENAME or XTOK_KEYBINDING", ct, parm);
		}
	}
	else {
		parseError("XTOK_INSTANCENAME", ct, parm);
	}
}

static void keyBinding(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokKeyBinding, parm);
	if(ct == XTOK_KEYBINDING) {
		keyBindingContent(parm, (parseUnion*)&stateUnion->xtokKeyBinding.val);
		stateUnion->xtokKeyBinding.type = stateUnion->xtokKeyBinding.val.type;
		ct = localLex((parseUnion*)&stateUnion->xtokKeyBinding, parm);
		if(ct == ZTOK_KEYBINDING) {
		}
		else {
			parseError("ZTOK_KEYBINDING", ct, parm);
		}
	}
	else {
		parseError("XTOK_KEYBINDING", ct, parm);
	}
}

static void keyBindingContent(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokKeyBindingContent, parm);
	if(ct == XTOK_KEYVALUE) {
		dontLex = 1;
		keyValue(parm, (parseUnion*)&stateUnion->xtokKeyBindingContent.keyValue);
		stateUnion->xtokKeyBindingContent.type = stateUnion->xtokKeyBindingContent.keyValue.valueType;
	}
	else if(ct == XTOK_VALUEREFERENCE) {
		dontLex = 1;
		valueReference(parm, (parseUnion*)&stateUnion->xtokKeyBindingContent.ref);
		stateUnion->xtokKeyBindingContent.type = "ref";
	}
	else {
		parseError("XTOK_KEYVALUE or XTOK_VALUEREFERENCE", ct, parm);
	}
}

static void keyValue(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokKeyValue, parm);
	if(ct == XTOK_KEYVALUE) {
		ct = localLex((parseUnion*)&stateUnion->xtokKeyValue, parm);
		if(ct == ZTOK_KEYVALUE) {
		}
		else {
			parseError("ZTOK_KEYVALUE", ct, parm);
		}
	}
	else {
		parseError("XTOK_KEYVALUE", ct, parm);
	}
}

static void value(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokValue, parm);
	if(ct == XTOK_VALUE) {
		valueData(parm, (parseUnion*)&stateUnion->xtokValue.data);
		stateUnion->xtokValue.type = stateUnion->xtokValue.data.type;
		ct = localLex((parseUnion*)&stateUnion->xtokValue, parm);
		if(ct == ZTOK_VALUE) {
		}
		else {
			parseError("ZTOK_VALUE", ct, parm);
		}
	}
	else {
		parseError("XTOK_VALUE", ct, parm);
	}
}

static void valueData(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokValueData, parm);
	if(ct == ZTOK_VALUE) {
		stateUnion->xtokValueData.type=typeValue_charP;
		dontLex = 1;
	}
	else if(ct == XTOK_CDATA) {
		stateUnion->xtokValueData.inst = parser_malloc(parm->heap, sizeof(XtokInstance));
		instance(parm, (parseUnion*)stateUnion->xtokValueData.inst);
		stateUnion->xtokValueData.type=typeValue_Instance;
		ct = localLex((parseUnion*)&stateUnion->xtokValueData, parm);
		if(ct == ZTOK_CDATA) {
		}
		else {
			parseError("ZTOK_CDATA", ct, parm);
		}
	}
	else {
		parseError("ZTOK_VALUE", ct, parm);
	}
}

static void valueArray(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokValueArray, parm);
	if(ct == XTOK_VALUEARRAY) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_VALUE) {
			do {
				dontLex = 1;
				value(parm, (parseUnion*)&lvalp.xtokValue);
				if(stateUnion->xtokValueArray.next >= stateUnion->xtokValueArray.max) {
					stateUnion->xtokValueArray.max *= 2;
					stateUnion->xtokValueArray.values = (char**)parser_realloc(parm->heap, stateUnion->xtokValueArray.values, sizeof(char*) * stateUnion->xtokValueArray.max);
				}
				stateUnion->xtokValueArray.values[stateUnion->xtokValueArray.next++] = lvalp.xtokValue.data.value;
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_VALUE);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokValueArray, parm);
		if(ct == ZTOK_VALUEARRAY) {
		}
		else {
			parseError("ZTOK_VALUEARRAY or XTOK_VALUE", ct, parm);
		}
	}
	else {
		parseError("XTOK_VALUEARRAY", ct, parm);
	}
}

static void valueRefArray(ParserControl *parm, parseUnion *stateUnion)
{
	parseUnion lvalp={0};
	ct = localLex((parseUnion*)&stateUnion->xtokValueRefArray, parm);
	if(ct == XTOK_VALUEREFARRAY) {
		ct = localLex(&lvalp, parm);
		dontLex = 1;
		if(ct == XTOK_VALUEREFERENCE) {
			do {
				dontLex = 1;
				valueReference(parm, (parseUnion*)&lvalp.xtokValueReference);
				if(stateUnion->xtokValueRefArray.next >= stateUnion->xtokValueRefArray.max) {
					stateUnion->xtokValueRefArray.max *= 2;
					stateUnion->xtokValueRefArray.values = (XtokValueReference*)parser_realloc(parm->heap, stateUnion->xtokValueRefArray.values, sizeof(XtokValueReference) * stateUnion->xtokValueRefArray.max);
				}
				stateUnion->xtokValueRefArray.values[stateUnion->xtokValueRefArray.next++] = lvalp.xtokValueReference;
				ct = localLex(&lvalp, parm);
			}
			while(ct == XTOK_VALUEREFERENCE);
			dontLex = 1;
		}
		ct = localLex((parseUnion*)&stateUnion->xtokValueRefArray, parm);
		if(ct == ZTOK_VALUEREFARRAY) {
		}
		else {
			parseError("ZTOK_VALUEREFARRAY or XTOK_VALUEREFERENCE", ct, parm);
		}
	}
	else {
		parseError("XTOK_VALUEREFARRAY", ct, parm);
	}
}

static void valueReference(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokValueReference, parm);
	if(ct == XTOK_VALUEREFERENCE) {
		valueReferenceData(parm, (parseUnion*)&stateUnion->xtokValueReference.data);
		stateUnion->xtokValueReference.type = stateUnion->xtokValueReference.data.type;
		ct = localLex((parseUnion*)&stateUnion->xtokValueReference, parm);
		if(ct == ZTOK_VALUEREFERENCE) {
		}
		else {
			parseError("ZTOK_VALUEREFERENCE", ct, parm);
		}
	}
	else {
		parseError("XTOK_VALUEREFERENCE", ct, parm);
	}
}

static void valueReferenceData(ParserControl *parm, parseUnion *stateUnion)
{
	ct = localLex((parseUnion*)&stateUnion->xtokValueReferenceData, parm);
	if(ct == XTOK_INSTANCEPATH) {
		dontLex = 1;
		instancePath(parm, (parseUnion*)&stateUnion->xtokValueReferenceData.instancePath);
		stateUnion->xtokValueReferenceData.type = typeValRef_InstancePath;
	}
	else if(ct == XTOK_LOCALINSTANCEPATH) {
		dontLex = 1;
		localInstancePath(parm, (parseUnion*)&stateUnion->xtokValueReferenceData.localInstancePath);
		stateUnion->xtokValueReferenceData.type = typeValRef_LocalInstancePath;
	}
	else if(ct == XTOK_INSTANCENAME) {
		dontLex = 1;
		instanceName(parm, (parseUnion*)&stateUnion->xtokValueReferenceData.instanceName);
		stateUnion->xtokValueReferenceData.type = typeValRef_InstanceName;
	}
	else {
		parseError("XTOK_INSTANCEPATH or XTOK_LOCALINSTANCEPATH or XTOK_INSTANCENAME", ct, parm);
	}
}

