⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cstrnpsr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/***************************************************************************//* ParseRangeCardinalityAttribute: Parses the range/cardinality attribute. *//***************************************************************************/static intBool ParseRangeCardinalityAttribute(  void *theEnv,  char *readSource,  CONSTRAINT_RECORD *constraints,  CONSTRAINT_PARSE_RECORD *parsedConstraints,  char *constraintName,  int multipleValuesAllowed)  {   struct token inputToken;   int range;   char *tempPtr = NULL;   /*=================================*/   /* Determine if we're parsing the  */   /* range or cardinality attribute. */   /*=================================*/   if (strcmp(constraintName,"range") == 0)     {      parsedConstraints->range = TRUE;      range = TRUE;     }   else     {      parsedConstraints->cardinality = TRUE;      range = FALSE;     }   /*===================================================================*/   /* The cardinality attribute can only be used with multifield slots. */   /*===================================================================*/   if ((range == FALSE) &&       (multipleValuesAllowed == FALSE))     {      PrintErrorID(theEnv,"CSTRNPSR",5,TRUE);      EnvPrintRouter(theEnv,WERROR,"The cardinality attribute ");      EnvPrintRouter(theEnv,WERROR,"can only be used with multifield slots.\n");      return(FALSE);     }   /*====================================================*/   /* The range attribute is not allowed with the        */   /* allowed-values/numbers/integers/floats attributes. */   /*====================================================*/   if ((range == TRUE) &&       (parsedConstraints->allowedValues ||        parsedConstraints->allowedNumbers ||        parsedConstraints->allowedIntegers ||        parsedConstraints->allowedFloats))     {      if (parsedConstraints->allowedValues) tempPtr = "allowed-values";      else if (parsedConstraints->allowedIntegers) tempPtr = "allowed-integers";      else if (parsedConstraints->allowedFloats) tempPtr = "allowed-floats";      else if (parsedConstraints->allowedNumbers) tempPtr = "allowed-numbers";      NoConjunctiveUseError(theEnv,"range",tempPtr);      return(FALSE);     }   /*==========================*/   /* Parse the minimum value. */   /*==========================*/   SavePPBuffer(theEnv," ");   GetToken(theEnv,readSource,&inputToken);   if ((inputToken.type == INTEGER) || ((inputToken.type == FLOAT) && range))     {      if (range)        {         ReturnExpression(theEnv,constraints->minValue);         constraints->minValue = GenConstant(theEnv,inputToken.type,inputToken.value);        }      else        {         ReturnExpression(theEnv,constraints->minFields);         constraints->minFields = GenConstant(theEnv,inputToken.type,inputToken.value);        }     }   else if ((inputToken.type == SF_VARIABLE) && (strcmp(inputToken.printForm,"?VARIABLE") == 0))     { /* Do nothing. */ }   else     {      char tempBuffer[120];      gensprintf(tempBuffer,"%s attribute",constraintName);      SyntaxErrorMessage(theEnv,tempBuffer);      return(FALSE);     }   /*==========================*/   /* Parse the maximum value. */   /*==========================*/   SavePPBuffer(theEnv," ");   GetToken(theEnv,readSource,&inputToken);   if ((inputToken.type == INTEGER) || ((inputToken.type == FLOAT) && range))     {      if (range)        {         ReturnExpression(theEnv,constraints->maxValue);         constraints->maxValue = GenConstant(theEnv,inputToken.type,inputToken.value);        }      else        {         ReturnExpression(theEnv,constraints->maxFields);         constraints->maxFields = GenConstant(theEnv,inputToken.type,inputToken.value);        }     }   else if ((inputToken.type == SF_VARIABLE) && (strcmp(inputToken.printForm,"?VARIABLE") == 0))     { /* Do nothing. */ }   else     {      char tempBuffer[120];      gensprintf(tempBuffer,"%s attribute",constraintName);      SyntaxErrorMessage(theEnv,tempBuffer);      return(FALSE);     }   /*================================*/   /* Parse the closing parenthesis. */   /*================================*/   GetToken(theEnv,readSource,&inputToken);   if (inputToken.type != RPAREN)     {      SyntaxErrorMessage(theEnv,"range attribute");      return(FALSE);     }   /*====================================================*/   /* Minimum value must be less than the maximum value. */   /*====================================================*/   if (range)     {      if (CompareNumbers(theEnv,constraints->minValue->type,                         constraints->minValue->value,                         constraints->maxValue->type,                         constraints->maxValue->value) == GREATER_THAN)        {         PrintErrorID(theEnv,"CSTRNPSR",2,TRUE);         EnvPrintRouter(theEnv,WERROR,"Minimum range value must be less than\n");         EnvPrintRouter(theEnv,WERROR,"or equal to the maximum range value\n");         return(FALSE);        }     }   else     {      if (CompareNumbers(theEnv,constraints->minFields->type,                         constraints->minFields->value,                         constraints->maxFields->type,                         constraints->maxFields->value) == GREATER_THAN)        {         PrintErrorID(theEnv,"CSTRNPSR",2,TRUE);         EnvPrintRouter(theEnv,WERROR,"Minimum cardinality value must be less than\n");         EnvPrintRouter(theEnv,WERROR,"or equal to the maximum cardinality value\n");         return(FALSE);        }     }   /*====================================*/   /* Return TRUE to indicate that the   */   /* attribute was successfully parsed. */   /*====================================*/   return(TRUE);  }/******************************************************************//* GetConstraintTypeFromAllowedName: Returns the type restriction *//*   associated with an allowed-... attribute.                    *//******************************************************************/static int GetConstraintTypeFromAllowedName(  char *constraintName)  {   if (strcmp(constraintName,"allowed-values") == 0) return(UNKNOWN_VALUE);   else if (strcmp(constraintName,"allowed-symbols") == 0) return(SYMBOL);   else if (strcmp(constraintName,"allowed-strings") == 0) return(STRING);   else if (strcmp(constraintName,"allowed-lexemes") == 0) return(SYMBOL_OR_STRING);   else if (strcmp(constraintName,"allowed-integers") == 0) return(INTEGER);   else if (strcmp(constraintName,"allowed-numbers") == 0) return(INTEGER_OR_FLOAT);   else if (strcmp(constraintName,"allowed-instance-names") == 0) return(INSTANCE_NAME);   else if (strcmp(constraintName,"allowed-classes") == 0) return(INSTANCE_OR_INSTANCE_NAME);   else if (strcmp(constraintName,"allowed-floats") == 0) return(FLOAT);   return(-1);  }/*******************************************************//* GetConstraintTypeFromTypeName: Converts a type name *//*   to its equivalent integer type restriction.       *//*******************************************************/static int GetConstraintTypeFromTypeName(  char *constraintName)  {   if (strcmp(constraintName,"SYMBOL") == 0) return(SYMBOL);   else if (strcmp(constraintName,"STRING") == 0) return(STRING);   else if (strcmp(constraintName,"LEXEME") == 0) return(SYMBOL_OR_STRING);   else if (strcmp(constraintName,"INTEGER") == 0) return(INTEGER);   else if (strcmp(constraintName,"FLOAT") == 0) return(FLOAT);   else if (strcmp(constraintName,"NUMBER") == 0) return(INTEGER_OR_FLOAT);   else if (strcmp(constraintName,"INSTANCE-NAME") == 0) return(INSTANCE_NAME);   else if (strcmp(constraintName,"INSTANCE-ADDRESS") == 0) return(INSTANCE_ADDRESS);   else if (strcmp(constraintName,"INSTANCE") == 0) return(INSTANCE_OR_INSTANCE_NAME);   else if (strcmp(constraintName,"EXTERNAL-ADDRESS") == 0) return(EXTERNAL_ADDRESS);   else if (strcmp(constraintName,"FACT-ADDRESS") == 0) return(FACT_ADDRESS);   return(-1);  }/**************************************************************//* GetAttributeParseValue: Returns a boolean value indicating *//*   whether a specific attribute has already been parsed.    *//**************************************************************/static int GetAttributeParseValue(  char *constraintName,  CONSTRAINT_PARSE_RECORD *parsedConstraints)  {   if (strcmp(constraintName,"type") == 0)     { return(parsedConstraints->type); }   else if (strcmp(constraintName,"range") == 0)     { return(parsedConstraints->range); }   else if (strcmp(constraintName,"cardinality") == 0)     { return(parsedConstraints->cardinality); }   else if (strcmp(constraintName,"allowed-values") == 0)     { return(parsedConstraints->allowedValues); }   else if (strcmp(constraintName,"allowed-symbols") == 0)     { return(parsedConstraints->allowedSymbols); }   else if (strcmp(constraintName,"allowed-strings") == 0)     { return(parsedConstraints->allowedStrings); }   else if (strcmp(constraintName,"allowed-lexemes") == 0)     { return(parsedConstraints->allowedLexemes); }   else if (strcmp(constraintName,"allowed-instance-names") == 0)     { return(parsedConstraints->allowedInstanceNames); }   else if (strcmp(constraintName,"allowed-classes") == 0)     { return(parsedConstraints->allowedClasses); }   else if (strcmp(constraintName,"allowed-integers") == 0)     { return(parsedConstraints->allowedIntegers); }   else if (strcmp(constraintName,"allowed-floats") == 0)     { return(parsedConstraints->allowedFloats); }   else if (strcmp(constraintName,"allowed-numbers") == 0)     { return(parsedConstraints->allowedNumbers); }   return(TRUE);  }/**********************************************************//* SetRestrictionFlag: Sets the restriction flag of a     *//*   constraint record indicating whether a specific      *//*   type has an associated allowed-... restriction list. *//**********************************************************/static void SetRestrictionFlag(  int restriction,  CONSTRAINT_RECORD *constraints,  int value)  {   switch (restriction)     {      case UNKNOWN_VALUE:         constraints->anyRestriction = value;         break;      case SYMBOL:         constraints->symbolRestriction = value;         break;      case STRING:         constraints->stringRestriction = value;         break;      case INTEGER:         constraints->integerRestriction = value;         break;      case FLOAT:         constraints->floatRestriction = value;         break;      case INTEGER_OR_FLOAT:         constraints->integerRestriction = value;         constraints->floatRestriction = value;         break;      case SYMBOL_OR_STRING:         constraints->symbolRestriction = value;         constraints->stringRestriction = value;         break;      case INSTANCE_NAME:         constraints->instanceNameRestriction = value;         break;      case INSTANCE_OR_INSTANCE_NAME:         constraints->classRestriction = value;         break;     }  }/********************************************************************//* SetParseFlag: Sets the flag in a parsed constraints data         *//*  structure indicating that a specific attribute has been parsed. *//********************************************************************/static void SetParseFlag(  CONSTRAINT_PARSE_RECORD *parsedConstraints,  char *constraintName)  {   if (strcmp(constraintName,"range") == 0)     { parsedConstraints->range = TRUE; }   else if (strcmp(constraintName,"type") == 0)     { parsedConstraints->type = TRUE; }   else if (strcmp(constraintName,"cardinality") == 0)     { parsedConstraints->cardinality = TRUE; }   else if (strcmp(constraintName,"allowed-symbols") == 0)     { parsedConstraints->allowedSymbols = TRUE; }   else if (strcmp(constraintName,"allowed-strings") == 0)     { parsedConstraints->allowedStrings = TRUE; }   else if (strcmp(constraintName,"allowed-lexemes") == 0)     { parsedConstraints->allowedLexemes = TRUE; }   else if (strcmp(constraintName,"allowed-integers") == 0)     { parsedConstraints->allowedIntegers = TRUE; }   else if (strcmp(constraintName,"allowed-floats") == 0)     { parsedConstraints->allowedFloats = TRUE; }   else if (strcmp(constraintName,"allowed-numbers") == 0)     { parsedConstraints->allowedNumbers = TRUE; }   else if (strcmp(constraintName,"allowed-values") == 0)     { parsedConstraints->allowedValues = TRUE; }   else if (strcmp(constraintName,"allowed-classes") == 0)     { parsedConstraints->allowedClasses = TRUE; }  }#endif /* (! RUN_TIME) && (! BLOAD_ONLY) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -