static struct lhsParseNode *ConjuctiveRestrictionParse( char *readSource, struct token *theToken, int *error) { struct lhsParseNode *bindNode; struct lhsParseNode *theNode, *nextOr, *nextAnd; int connectorType; /*=====================================*/ /* Get the first node and determine if */ /* it is a binding variable. */ /*=====================================*/ theNode = LiteralRestrictionParse(readSource,theToken,error); if (*error == TRUE) { return(NULL); } GetToken(readSource,theToken); if (((theNode->type == SF_VARIABLE) || (theNode->type == MF_VARIABLE)) && (theNode->negated == FALSE) && (theToken->type != OR_CONSTRAINT)) { theNode->bindingVariable = TRUE; bindNode = theNode; nextOr = NULL; nextAnd = NULL; } else { bindNode = GetLHSParseNode(); if (theNode->type == MF_VARIABLE) bindNode->type = MF_WILDCARD; else bindNode->type = SF_WILDCARD; bindNode->negated = FALSE; bindNode->bottom = theNode; nextOr = theNode; nextAnd = theNode; } /*===================================*/ /* Process the connected constraints */ /* within the constraint */ /*===================================*/ while ((theToken->type == OR_CONSTRAINT) || (theToken->type == AND_CONSTRAINT)) { /*==========================*/ /* Get the next constraint. */ /*==========================*/ connectorType = theToken->type; GetToken(readSource,theToken); theNode = LiteralRestrictionParse(readSource,theToken,error); if (*error == TRUE) { ReturnLHSParseNodes(bindNode); return(NULL); } /*=======================================*/ /* Attach the new constraint to the list */ /* of constraints for this field. */ /*=======================================*/ if (connectorType == OR_CONSTRAINT) { if (nextOr == NULL) { bindNode->bottom = theNode; } else { nextOr->bottom = theNode; } nextOr = theNode; nextAnd = theNode; } else if (connectorType == AND_CONSTRAINT) { if (nextAnd == NULL) { bindNode->bottom = theNode; nextOr = theNode; } else { nextAnd->right = theNode; } nextAnd = theNode; } else { SystemError("RULEPSR",1); ExitRouter(EXIT_FAILURE); } /*==================================================*/ /* Determine if any more restrictions are connected */ /* to the current list of restrictions. */ /*==================================================*/ GetToken(readSource,theToken); } /*==========================================*/ /* Check for illegal mixing of single and */ /* multifield values within the constraint. */ /*==========================================*/ if (CheckForVariableMixing(bindNode)) { *error = TRUE; ReturnLHSParseNodes(bindNode); return(NULL); } /*========================*/ /* Return the constraint. */ /*========================*/ return(bindNode); }
struct lhsParseNode *theNode, *nextOr, *nextAnd; int connectorType; #if FUZZY_DEFTEMPLATES int fuzzyType; fuzzyType = (theConstraints != NULL) ? theConstraints->fuzzyValuesAllowed : FALSE; #endif /*=====================================*/ /* Get the first node and determine if */ /* it is a binding variable. */ /*=====================================*/ #if !FUZZY_DEFTEMPLATES theNode = LiteralRestrictionParse(theEnv,readSource,theToken,error); #else theNode = LiteralRestrictionParse(theEnv,readSource,theToken,error,theConstraints); if (*error == TRUE) { return(NULL); } if (fuzzyType && theNode->type != FUZZY_VALUE && theNode->type != SF_VARIABLE) { /* error -- fuzzy slot can only have fuzzy expression, SF variable (possible connect with ANDS (&), or a SF wildcard (which is taken care of in RestrictionParse */ SyntaxErrorMessage(theEnv,"Fuzzy Value slot\n(only ?, ?var, or linguistic expression allowed)"); *error = TRUE; return( NULL );