>xabsl   The Extensible Agent Behavior Specification Language

XabslEngine Class Library Reference

 

XabslEnumeratedExpression.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file XabslEnumeratedExpression.cpp
00003 *
00004 * Implementation of EnumeratedExpression and derivates
00005 * 
00006 * @author <a href="http://www.sim.informatik.tu-darmstadt.de/pers/card/risler.html">Max Risler</a>
00007 */
00008 
00009 #include "XabslEnumeratedExpression.h"
00010 #include "XabslOption.h"
00011 
00012 namespace xabsl 
00013 {
00014   
00015 EnumeratedExpression::~EnumeratedExpression()
00016 {
00017 }
00018 
00019 EnumeratedExpression* EnumeratedExpression::create(const Enumeration* enumeration,
00020                                                          InputSource& input, 
00021                                                          ErrorHandler& errorHandler,
00022                                                          Symbols& symbols,
00023                                                          Option& option,
00024                                                          State& state)
00025 {
00026   char c[2];
00027   input.readString(c,1);
00028   
00029   switch (*c)
00030   {
00031   case 'v':
00032     return new EnumeratedValue(enumeration, input,errorHandler);
00033   case 'p':
00034     return new EnumeratedOptionParameterRef(enumeration, input,errorHandler,option);
00035   case 'i':
00036     return new EnumeratedInputSymbolRef(enumeration, input,errorHandler,symbols,option,state);
00037   case 'o':
00038     return new EnumeratedOutputSymbolRef(enumeration, input,errorHandler,symbols);
00039   case 'q':
00040     return new ConditionalEnumeratedExpression(enumeration, input,errorHandler,symbols,option,state);
00041   default:
00042     errorHandler.error("XabslEnumeratedExpression::create(): unknown expression type \"%c\"",*c);
00043   }
00044   return 0;
00045 }
00046 
00047 bool EnumeratedExpression::createOperand(const EnumeratedExpression*& operand,
00048                                             const Enumeration* enumeration,
00049                                             InputSource& input, 
00050                                             ErrorHandler& errorHandler,
00051                                             Symbols& symbols,
00052                                             Option& option,
00053                                             State& state)
00054 {
00055   operand = EnumeratedExpression::create(enumeration,input,errorHandler,symbols,option,state);
00056   
00057   if (operand == 0) 
00058   {
00059     errorHandler.error("XabslEnumeratedExpression::createOperand(): created operand is 0");
00060     return false;
00061   }
00062   
00063   if (errorHandler.errorsOccurred)
00064   {
00065     errorHandler.error("XabslEnumeratedExpression::createOperand(): could not create operand");
00066     if (operand != 0) delete operand;
00067     return false;
00068   }
00069   
00070   return true;
00071 }
00072 
00073 EnumeratedValue::EnumeratedValue(const Enumeration* enumeration,
00074                                        InputSource& input, 
00075                                        ErrorHandler& errorHandler)
00076 {
00077   char buf[100];
00078   input.readString(buf,99);
00079 
00080   if (enumeration == NULL)
00081   {
00082     errorHandler.error("XabslEnumeratedValue::EnumeratedValue(): enumerated value can not be created without specifying enumeration");
00083     return;
00084   }
00085 
00086   if (!enumeration->enumElements.exists(buf))
00087   {
00088     errorHandler.error("XabslEnumeratedValue::EnumeratedValue(): enum element \"%s\" of enumeration \"%s\" was not registered", buf, enumeration->n);
00089     return;
00090   }
00091   
00092   value = enumeration->enumElements[buf]->v;
00093   this->enumeration = enumeration;
00094 }
00095 
00096 int EnumeratedValue::getValue() const
00097 {
00098   return value;
00099 }
00100 
00101 EnumeratedOptionParameterRef::EnumeratedOptionParameterRef(const Enumeration* enumeration,
00102                                                    InputSource& input, 
00103                                                    ErrorHandler& errorHandler,
00104                                                    Option& option)
00105 {
00106   char buf[100];
00107   input.readString(buf,99);
00108   
00109   XABSL_DEBUG_INIT(errorHandler.message("creating a reference to enumerated option parameter \"%s\"",buf));
00110   
00111   if (!option.parameters->enumerated.exists(buf))
00112   {
00113     errorHandler.error("XabslEnumeratedOptionParameterRef::EnumeratedOptionParameterRef(): enumerated option parameter \"%s\" does not exist",buf);
00114     return;
00115   }
00116   
00117   parameter = option.parameters->enumerated.getPElement(buf)->e;
00118   this->enumeration = option.parameters->enumerations[buf];
00119   if (enumeration != NULL && enumeration != this->enumeration)
00120   {
00121     errorHandler.error("XabslEnumeratedOptionParameterRef::EnumeratedOptionParameterRef(): enumeration input symbol \"%s\" does not match enumeration type \"%s\"", buf, enumeration->n);
00122   }
00123 }
00124 
00125 int EnumeratedOptionParameterRef::getValue() const
00126 {
00127   return *parameter;
00128 }
00129 
00130 EnumeratedInputSymbolRef::EnumeratedInputSymbolRef(const Enumeration* enumeration,
00131                                                                InputSource& input, 
00132                                                                ErrorHandler& errorHandler,
00133                                                                Symbols& symbols,
00134                                                                Option& option,
00135                                                                State& state) :
00136   symbol(0), parameters(0)
00137 {
00138   char buf[100];
00139   input.readString(buf,99);
00140   
00141   XABSL_DEBUG_INIT(errorHandler.message("creating reference to enumerated input symbol \"%s\"",buf));
00142   
00143   if (!symbols.enumeratedInputSymbols.exists(buf))
00144   {
00145     errorHandler.error("XabslEnumeratedInputSymbolRef::XabslEnumeratedInputSymbolRef(): enumerated input symbol \"%s\" was not registered at the engine",buf);
00146     return;
00147   }
00148   
00149   symbol = symbols.enumeratedInputSymbols[buf];
00150   this->enumeration = symbol->enumeration;
00151 
00152   if (enumeration != NULL && enumeration != this->enumeration)
00153   {
00154     errorHandler.error("XabslEnumeratedInputSymbolRef::XabslEnumeratedInputSymbolRef(): enumeration input symbol \"%s\" does not match enumeration type \"%s\"", buf, enumeration->n);
00155   }
00156 
00157   parameters = new ParameterAssignment(&symbol->parameters, errorHandler);
00158 
00159   parameters->create(input, symbols, option, state);
00160 }
00161   
00162 EnumeratedInputSymbolRef::~EnumeratedInputSymbolRef()
00163 {
00164   if (parameters != 0)
00165     delete parameters;
00166 }
00167 
00168 int EnumeratedInputSymbolRef::getValue() const
00169 {
00170   // set the symbol parameters
00171   if (parameters->set())
00172     symbol->parametersChanged();
00173 
00174   return symbol->getValue();
00175 }
00176 
00177 EnumeratedOutputSymbolRef::EnumeratedOutputSymbolRef(const Enumeration* enumeration,
00178                                                                InputSource& input, 
00179                                                                ErrorHandler& errorHandler,
00180                                                                Symbols& symbols)
00181 {
00182   char buf[100];
00183   input.readString(buf,99);
00184   
00185   XABSL_DEBUG_INIT(errorHandler.message("creating a reference to an enumerated output symbol \"%s\"",buf));
00186   
00187   if (!symbols.enumeratedOutputSymbols.exists(buf))
00188   {
00189     errorHandler.error("XabslEnumeratedOutputSymbolRef::EnumeratedOutputSymbolRef(): enumerated output symbol \"%s\" was not registered",buf);
00190     return;
00191   }
00192   
00193   symbol = symbols.enumeratedOutputSymbols[buf];
00194   this->enumeration = symbol->enumeration;
00195 
00196   if (enumeration != NULL && enumeration != this->enumeration)
00197   {
00198     errorHandler.error("XabslEnumeratedInputSymbolRef::XabslEnumeratedInputSymbolRef(): enumeration input symbol \"%s\" does not match enumeration type \"%s\"", buf, enumeration->n);
00199   }
00200 }
00201 
00202 int EnumeratedOutputSymbolRef::getValue() const
00203 {
00204   return symbol->getValue();
00205 }
00206 
00207 ConditionalEnumeratedExpression::ConditionalEnumeratedExpression(const Enumeration* enumeration,
00208     InputSource& input, 
00209     ErrorHandler& errorHandler,
00210     Symbols& symbols,
00211     Option& option,
00212     State& state)
00213 {
00214   XABSL_DEBUG_INIT(errorHandler.message("creating a question mark operator"));
00215 
00216   condition = BooleanExpression::create(input,errorHandler,symbols,option,state);
00217 
00218   if (condition == 0) 
00219   {
00220     errorHandler.error("XabslQuestionMarkOperator::QuestionMarkOperator(): created condition is 0");
00221     return;
00222   }
00223   else if (errorHandler.errorsOccurred)
00224   {
00225     errorHandler.error("XabslQuestionMarkOperator::QuestionMarkOperator(): could not create condition");
00226     delete condition;
00227     return;
00228   }
00229 
00230   if (!EnumeratedExpression::createOperand(expression1,enumeration,input,errorHandler,symbols,option,state))
00231   {
00232     errorHandler.error("XabslQuestionMarkOperator::QuestionMarkOperator(): could not create decimal expression1");
00233     return;
00234   }
00235   
00236   if (!EnumeratedExpression::createOperand(expression2,enumeration,input,errorHandler,symbols,option,state))
00237   {
00238     errorHandler.error("XabslQuestionMarkOperator::QuestionMarkOperator(): could not create decimal expression2");
00239     return;
00240   }
00241   this->enumeration = enumeration;
00242 }
00243 
00244 ConditionalEnumeratedExpression::~ConditionalEnumeratedExpression()
00245 {
00246   if (condition!=0) delete condition;
00247   if (expression1!=0) delete expression1;
00248   if (expression2!=0) delete expression2;
00249 }
00250 
00251 int ConditionalEnumeratedExpression::getValue() const
00252 {
00253   if (condition->getValue())
00254   {
00255     return expression1->getValue();
00256   }
00257   else
00258   {
00259     return expression2->getValue();
00260   }
00261 }
00262 
00263 } // namespace
00264 

Up | Main Page | Generated at Wed Aug 19 17:32:29 2009.