]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.databoard/cpp/DataBoardTest/DataBoard/DataBoardRepository.cpp
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.databoard / cpp / DataBoardTest / DataBoard / DataBoardRepository.cpp
index ce36d9312cf3f8344ff8971efb9de330175063e3..fa6db12e68ea00cb5300b6dc419697a857b79972 100644 (file)
-#include "DataBoardRepository.h"\r
-\r
-#include "RecordType.h"\r
-#include "ArrayType.h"\r
-#include "Constants.h"\r
-#include "Component.h"\r
-#include "IntegerType.h"\r
-#include "DataType.h"\r
-#include "StringType.h"\r
-#include "DoubleType.h"\r
-#include "LongType.h"\r
-#include "ByteType.h"\r
-#include "BooleanType.h"\r
-#include "MapType.h"\r
-#include "OptionalType.h"\r
-#include "UnionType.h"\r
-#include "VariantType.h"\r
-#include "Range.h"\r
-#include "Limit.h"\r
-\r
-#include <iostream>\r
-#include <sstream>\r
-\r
-namespace Databoard {\r
-       namespace Type {\r
-\r
-               std::string strTypeDefinition::writeOut()\r
-               {\r
-                       std::string r;\r
-                       \r
-                       r += "type " + name + " = ";\r
-\r
-                       r += dataBoard->writeOut();\r
-\r
-                       return r;\r
-               }\r
-\r
-               DataBoardRepository::DataBoardRepository()\r
-               {\r
-               }\r
-\r
-               DataBoardRepository::~DataBoardRepository()\r
-               {\r
-                       for(int i = 0; i < (int)dataBoards.size(); ++i)\r
-                       {\r
-                               delete dataBoards.at(i).dataBoard;\r
-                       }\r
-\r
-                       dataBoards.clear();\r
-               }\r
-\r
-               void DataBoardRepository::addDataBoard(char* name, DataType* dataBoard)\r
-               {\r
-                       strTypeDefinition dataBoard_;\r
-\r
-                       dataBoard_.name = std::string(name);\r
-                       dataBoard_.dataBoard = dataBoard;\r
-\r
-                       dataBoards.push_back(dataBoard_);\r
-               }\r
-\r
-               int DataBoardRepository::count()\r
-               {\r
-                       return (int)dataBoards.size();\r
-               }\r
-\r
-               strTypeDefinition DataBoardRepository::getDataBoard(int i)\r
-               {\r
-                       return dataBoards.at(i);\r
-               }\r
-\r
-               DataType* DataBoardRepository::getDataBoard(std::string name)\r
-               {\r
-                       for(int i = 0; i < (int)dataBoards.size(); ++i)\r
-                       {\r
-                               if(dataBoards.at(i).name == name)\r
-                               {\r
-                                       return dataBoards.at(i).dataBoard;\r
-                               }\r
-                       }\r
-\r
-                       return NULL;\r
-               }\r
-\r
-               bool DataBoardRepository::open(std::string fileName)\r
-               {\r
-                       pANTLR3_INPUT_STREAM input = antlr3AsciiFileStreamNew((pANTLR3_UINT8)fileName.c_str());\r
-\r
-                       if ( input == NULL )\r
-                       {\r
-                               ANTLR3_FPRINTF(stderr, "string: %s\n", fileName.c_str());\r
-\r
-                               return false;\r
-                       }\r
-\r
-                       pSimanticsDataLexer lexer = SimanticsDataLexerNew(input);\r
-\r
-                       if ( lexer == NULL )\r
-                       {\r
-                               ANTLR3_FPRINTF(stderr, "Unable to create the lexer due to malloc() failure1\n");\r
-                               //exit(ANTLR3_ERR_NOMEM);\r
-\r
-                               return false;\r
-                       }\r
-\r
-                       pANTLR3_COMMON_TOKEN_STREAM tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lexer));//->pLexer->tokSource);\r
-\r
-                       if (tstream == NULL)\r
-                       {\r
-                               ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate token stream\n");\r
-                               //exit(ANTLR3_ERR_NOMEM);\r
-\r
-                               return false;\r
-                       }\r
-\r
-                       pSimanticsDataParser parser = SimanticsDataParserNew(tstream); // CParserNew is generated by ANTLR3\r
-\r
-                       if (parser == NULL)\r
-                       {\r
-                               ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate parser\n");\r
-                               //exit(ANTLR3_ERR_NOMEM);\r
-\r
-                               return false;\r
-                       }\r
-\r
-                       SimanticsDataParser_typeDefinitions_return astType = parser->typeDefinitions(parser);\r
-\r
-                       bool retValue = true;\r
-\r
-                       if(lexer->pLexer->rec->state->errorCount == 0)\r
-                       {\r
-                               temporaryname t(this);\r
-\r
-                               t.parse(astType.tree);\r
-                       \r
-                               //print(astType.tree);\r
-                       }\r
-                       else\r
-                       {\r
-                               retValue = false;\r
-                       }\r
-\r
-\r
-                       parser->free(parser);\r
-                       tstream->free(tstream);\r
-                       lexer->free(lexer);\r
-                       input->free(input);\r
-\r
-                       return retValue;\r
-               }\r
-\r
-               void DataBoardRepository::print(pANTLR3_BASE_TREE tree, int indent)\r
-               {\r
-                       for(int i=0;i<indent;++i)\r
-                               std::cout << "  ";\r
-\r
-                       std::cout << tree->getText(tree)->chars << " " << \r
-                               tree->getType(tree) << std::endl;\r
-\r
-                       for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
-                       {\r
-                               print((pANTLR3_BASE_TREE)tree->getChild(tree, i), indent + 1);\r
-                       }\r
-               }\r
-\r
-               const strTypeDefinition* DataBoardRepository::get(std::string name)\r
-               {\r
-                       for(int i = 0; i < (int)dataBoards.size(); ++i)\r
-                       {\r
-                               const strTypeDefinition& dataBoard = dataBoards.at(i); // for debug purposes\r
-\r
-                               if(dataBoard.name == name)\r
-                               {\r
-                                       return &dataBoard;\r
-                               }\r
-                       }\r
-\r
-                       return NULL;\r
-               }\r
-\r
-               ///////////////////////////////////////////////\r
-\r
-               temporaryname::temporaryname(DataBoardRepository* dataBoardRepository)\r
-               {\r
-                       this->dataBoardRepository = dataBoardRepository;\r
-               }\r
-\r
-               temporaryname::~temporaryname()\r
-               {\r
-               }\r
-\r
-               DataType* temporaryname::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)\r
-               //DataType* DataBoardRepository::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)\r
-               //DataType* parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)\r
-               {\r
-                       switch(tree->getType(tree)) {\r
-                               case TYPE_DEFINITIONS:\r
-                                       {\r
-                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
-                                               {\r
-                                                       parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), parent, indent + 1);\r
-                                               }\r
-                                       }\r
-                                       break;\r
-                               case TYPE_DEFINITION:\r
-                                       {\r
-                                               if(tree->getChildCount(tree) == 2)\r
-                                               {\r
-                                                       pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
-                                                       pANTLR3_BASE_TREE type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
-\r
-                                                       DataType* dataBoard = parse(type, parent, indent+1);\r
-\r
-                                                       if(dataBoard != NULL)\r
-                                                       {\r
-                                                               dataBoard->setNotBuiltIn();\r
-\r
-                                                               if(dataBoardRepository != NULL)\r
-                                                               {\r
-                                                                       dataBoardRepository->addDataBoard((char*)id->getText(id)->chars, dataBoard);\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       break;\r
-                               case TUPLE_TYPE:\r
-                                       {\r
-                                               RecordType* record = new RecordType();\r
-\r
-                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
-                                               {\r
-                                                       DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);\r
-\r
-                                                       if(childType != NULL)\r
-                                                       {\r
-                                                               std::stringstream ss;\r
-\r
-                                                               ss << i;\r
-\r
-                                                               std::string tupleId;\r
-\r
-                                                               ss >> tupleId;\r
-\r
-                                                               addToChildren(record, (char*)tupleId.c_str(), childType);\r
-                                                       }\r
-                                               }\r
-\r
-                                               return record;\r
-                                       }\r
-\r
-                                       break;\r
-\r
-                               case RECORD_TYPE:\r
-                                       {\r
-                                               RecordType* record = new RecordType();\r
-\r
-                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
-                                               {\r
-                                                       DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);\r
-                                               }\r
-\r
-                                               return record;\r
-                                       }\r
-\r
-                                       break;\r
-                               case ARRAY_TYPE:\r
-                                       {\r
-                                               ArrayType* arrayType = new ArrayType();\r
-\r
-                                               int childCount = tree->getChildCount(tree);\r
-\r
-                                               if(childCount >= 1)\r
-                                               {\r
-                                                       DataType* dataType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, 0), parent);\r
-\r
-                                                       arrayType->setComponentType(dataType);\r
-                                                       \r
-                                                       if(childCount >= 2)\r
-                                                       {\r
-                                                               Range* range = parseRange(tree, 1, childCount);\r
-\r
-                                                               arrayType->setLength(range);\r
-                                                       }\r
-                                               }\r
-\r
-                                               return arrayType;\r
-                                       }\r
-\r
-                                       break;\r
-\r
-                               case UNION_TYPE:\r
-                                       {\r
-                                               UnionType* unionType = new UnionType();\r
-\r
-                                               int childCount = tree->getChildCount(tree);\r
-\r
-                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
-                                               {\r
-                                                       pANTLR3_BASE_TREE p = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
-\r
-                                                       if(p->getChildCount(p) == 1)\r
-                                                       {\r
-                                                               pANTLR3_BASE_TREE t = (pANTLR3_BASE_TREE)p->getChild(p, 0);\r
-                                                               \r
-                                                               std::string dataTypeName((char*)t->getText(t)->chars);\r
-\r
-                                                               DataType* dataType = NULL;\r
-\r
-                                                               if(dataBoardRepository != NULL)\r
-                                                               {\r
-                                                                       dataType = dataBoardRepository->getDataBoard(dataTypeName);\r
-                                                               }\r
-\r
-                                                               unionType->addComponent(dataTypeName, dataType);\r
-                                                       }\r
-                                               }\r
-\r
-                                               return unionType;\r
-                                       }\r
-                                       break;\r
-\r
-                               case TYPE_COMPONENT:\r
-                                       {\r
-                                               pANTLR3_BASE_TREE parameter = NULL;\r
-                                               pANTLR3_BASE_TREE type = NULL;\r
-                                               \r
-                                               if(tree->getChildCount(tree) == 2)\r
-                                               {\r
-                                                       parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
-                                                       type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
-                                               }\r
-\r
-                                               DataType* returnType = NULL;\r
-\r
-                                               if(type != NULL)\r
-                                               {\r
-                                                       if(type->getType(type) == TYPE_REFERENCE)\r
-                                                       {\r
-                                                               returnType = parse(type, parent, indent + 1);\r
-                                                       }\r
-                                                       else if(type->getType(type) == RECORD_TYPE)\r
-                                                       {\r
-                                                               returnType = parse(type, parent, indent + 1);\r
-                                                       }\r
-                                                       else if(type->getType(type) == TUPLE_TYPE)\r
-                                                       {\r
-                                                               returnType = parse(type, parent, indent + 1);\r
-                                                       }\r
-                                                       else if(type->getType(type) == ARRAY_TYPE)\r
-                                                       {\r
-                                                               returnType = parse(type, parent, indent + 1);\r
-                                                       }\r
-                                                       else\r
-                                                       {\r
-                                                               //std::cout << "!!" << std::endl;\r
-                                                               //std::cout << parameter->getText(parameter)->chars << std::endl;\r
-                                                               //std::cout << parameter->getType(parameter) << std::endl;\r
-\r
-                                                               //std::cout << type->getText(type)->chars << std::endl;\r
-                                                               //std::cout << type->getType(type) << std::endl;\r
-                                                       }\r
-                                               }\r
-\r
-                                               if(parameter != NULL && returnType != NULL)\r
-                                               {\r
-                                                       addToChildren(parent, (char*)parameter->getText(parameter)->chars, returnType);\r
-                                               }\r
-\r
-                                               return returnType;\r
-\r
-                                               break;\r
-                                       }\r
-                               case TYPE_REFERENCE:\r
-                                       if(tree->getChildCount(tree) >= 1)\r
-                                       {\r
-                                               pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
-\r
-                                               const char* typeName = (char*)id->getText(id)->chars;\r
-\r
-                                               bool errFound = false;\r
-\r
-                                               DataType* returnType = NULL;\r
-\r
-                                               if(id->getType(id) == ID)\r
-                                               {\r
-                                                       if(strEquals(typeName, STR_BOOLEAN) == true)\r
-                                                       {\r
-                                                               returnType = new BooleanType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_INTEGER) == true)\r
-                                                       {\r
-                                                               returnType = new IntegerType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_DOUBLE) == true)\r
-                                                       {\r
-                                                               returnType = new DoubleType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_BYTE) == true)\r
-                                                       {\r
-                                                               returnType = new ByteType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_LONG) == true)\r
-                                                       {\r
-                                                               returnType = new LongType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_FLOAT) == true)\r
-                                                       {\r
-                                                               // double=>float contradiction on purpose\r
-                                                               returnType = new DoubleType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_STRING) == true)\r
-                                                       {\r
-                                                               returnType = new StringType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_MAP) == true)\r
-                                                       {\r
-                                                               returnType = new MapType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_OPTIONAL) == true)\r
-                                                       {\r
-                                                               returnType = new OptionalType();\r
-                                                       }\r
-                                                       else if(strEquals(typeName, STR_VARIANT) == true)\r
-                                                       {\r
-                                                               returnType = new VariantType();\r
-                                                       }\r
-                                                       else\r
-                                                       {\r
-                                                               if(dataBoardRepository != NULL)\r
-                                                               {\r
-                                                                       returnType = dataBoardRepository->getDataBoard(typeName);\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-\r
-                                               parseParameters(tree, returnType);\r
-\r
-                                               //if(errFound == true)\r
-                                               //{\r
-                                               //      std::cout << "!-" << std::endl;\r
-                                               //      std::cout << "unknown: " << typeName << std::endl << std::endl;\r
-\r
-                                               //      std::cout << parameter->getText(parameter)->chars << std::endl;\r
-                                               //      std::cout << parameter->getType(parameter) << std::endl;\r
-\r
-                                               //      std::cout << "-!" << std::endl;\r
-                                               //}\r
-\r
-                                               return returnType;\r
-                                       }\r
-                                       break;\r
-                               case TYPE_ANNOTATION:\r
-                                       if(tree->getChildCount(tree) == 2)\r
-                                       {\r
-                                               pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
-                                               pANTLR3_BASE_TREE parameterValue = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
-\r
-                                               const char* idName = (char*)id->getText(id)->chars;\r
-\r
-                                               if(strEquals(idName, STR_UNIT) == true)\r
-                                               {\r
-                                                       std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
-\r
-                                                       NumberType* numberType = dynamic_cast<NumberType*>(parent);\r
-\r
-                                                       if(numberType != NULL)\r
-                                                       {\r
-                                                               numberType->setUnit(strValue);\r
-                                                       }\r
-                                               }\r
-                                               //else if(strEquals(typeName, STR_RANGE) == true)\r
-                                               //{\r
-                                               //}\r
-                                               else if(strEquals(idName, STR_PATTERN) == true)\r
-                                               {\r
-                                                       std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
-\r
-                                                       StringType* stringType = dynamic_cast<StringType*>(parent);\r
-\r
-                                                       if(stringType != NULL)\r
-                                                       {\r
-                                                               stringType->setPattern(strValue);\r
-                                                       }\r
-                                               }\r
-                                               else if(strEquals(idName, STR_MIMETYPE) == true)\r
-                                               {\r
-                                                       std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
-\r
-                                                       StringType* stringType = dynamic_cast<StringType*>(parent);\r
-\r
-                                                       if(stringType != NULL)\r
-                                                       {\r
-                                                               stringType->setMimeType(strValue);\r
-                                                       }\r
-                                               }\r
-                                               //else if(strEquals(idName, STR_LENGTH) == true) // range\r
-                                               //{\r
-                                               //      std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
-\r
-                                               //      StringType* stringType = dynamic_cast<StringType*>(parent);\r
-\r
-                                               //      if(stringType != NULL)\r
-                                               //      {\r
-                                               //              stringType->setLength(strValue);\r
-                                               //      }\r
-                                               //}\r
-                                       }\r
-\r
-                                       break;\r
-                               case ID:\r
-                                       parent = parent;\r
-                                       break;\r
-\r
-                               default:\r
-                                       break;\r
-                       }\r
-\r
-                       return NULL;\r
-               }\r
-\r
-               Range* temporaryname::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)\r
-               //Range* DataBoardRepository::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)\r
-               //Range* parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)\r
-               {\r
-                       Range* range = new Range();\r
-\r
-                       bool rangeLower = true;\r
-\r
-                       bool inclusiveLower = true;\r
-                       bool inclusiveUpper = true;\r
-\r
-                       for(int i = minPos;i < maxPos; ++i)\r
-                       {\r
-                               pANTLR3_BASE_TREE rangechild = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
-\r
-                               std::string rangeString((char*)rangechild->getText(rangechild)->chars);\r
-\r
-                               if(i == minPos && rangeString == STR_BRACEOPEN)\r
-                               {\r
-                                       inclusiveLower = false;\r
-                               }\r
-                               else if(i == minPos && rangeString == STR_BRACKETOPEN)\r
-                               {\r
-                                       inclusiveLower = true;\r
-                               }\r
-                               else if(i == (maxPos-1) && rangeString == STR_BRACECLOSE)\r
-                               {\r
-                                       inclusiveUpper = false;\r
-                               }\r
-                               else if(i == (maxPos-1) && rangeString == STR_BRACKETCLOSE)\r
-                               {\r
-                                       inclusiveUpper = true;\r
-                               }\r
-                               else if(rangeString == STR_RANGESPLIT)\r
-                               {\r
-                                       rangeLower = false;\r
-                               }\r
-                               else\r
-                               {\r
-                                       if(rangeLower == true)\r
-                                       {\r
-                                               range->setLower(rangeString);\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               range->setUpper(rangeString);\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       if(inclusiveLower == true)\r
-                       {\r
-                               range->getLower()->setInclusive();\r
-                       }\r
-                       if(inclusiveUpper == true)\r
-                       {\r
-                               range->getUpper()->setInclusive();\r
-                       }\r
-\r
-                       // split not received => upper = lower\r
-                       if(rangeLower == true)\r
-                       {\r
-                               range->setUpper(range->getLower()->getValue());\r
-                       }\r
-\r
-                       return range;\r
-               }\r
-\r
-               bool temporaryname::addToChildren(DataType* parent, char* name, DataType* children)\r
-               //bool DataBoardRepository::addToChildren(DataType* parent, char* name, DataType* children)\r
-               //bool addToChildren(DataType* parent, char* name, DataType* children)\r
-               {\r
-                       //TypeRoot* typeRoot = dynamic_cast<TypeRoot*>(parent);\r
-\r
-                       //if(typeRoot != NULL)\r
-                       //{\r
-                       //      typeRoot->addDataBoard(name, children);\r
-\r
-                       //      return true;\r
-                       //}\r
-\r
-                       RecordType* recordType = dynamic_cast<RecordType*>(parent);\r
-\r
-                       if(recordType != NULL)\r
-                       {\r
-                               recordType->addComponent(name, children);\r
-\r
-                               return true;\r
-                       }\r
-\r
-                       return false;\r
-               }\r
-\r
-               void temporaryname::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)\r
-               //void DataBoardRepository::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)\r
-               //void parseParameters(pANTLR3_BASE_TREE tree, DataType* type)\r
-               {\r
-                       if((int)tree->getChildCount(tree) >= 2)\r
-                       {\r
-                               if(dynamic_cast<NumberType*>(type) != NULL)\r
-                               {\r
-                                       NumberType* numberType = (NumberType*)type;\r
-\r
-                                       int annotationCount = (int)tree->getChildCount(tree);\r
-\r
-                                       if(annotationCount >= 1)\r
-                                       {\r
-                                               for(int i = 1; i < annotationCount; ++i)\r
-                                               {\r
-                                                       pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
-\r
-                                                       pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);\r
-\r
-                                                       const char* unitName = (char*)unit->getText(unit)->chars;\r
-\r
-                                                       if(strEquals(unitName, STR_UNIT) == true)\r
-                                                       {\r
-                                                               if((int)annotation->getChildCount(annotation) == 2)\r
-                                                               {\r
-                                                                       pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);\r
-\r
-                                                                       std::string strValue((char*)value->getText(value)->chars);\r
-\r
-                                                                       strValue = removeQuotes(strValue);\r
-\r
-                                                                       NumberType* numberType = dynamic_cast<NumberType*>(type);\r
-\r
-                                                                       if(numberType != NULL)\r
-                                                                       {\r
-                                                                               numberType->setUnit(strValue);\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                                       else if(strEquals(unitName, STR_RANGE) == true)\r
-                                                       {\r
-                                                               int c = (int)annotation->getChildCount(annotation);\r
-                                                               // possibilities:\r
-                                                               // 5: range;[;n;..;]\r
-                                                               // 5: range;[;..;m;]\r
-                                                               // 6: range;[;n;..;m;]\r
-                                                               if(c >= 5)\r
-                                                               {\r
-                                                                       //pANTLR3_BASE_TREE openBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);\r
-                                                                       //pANTLR3_BASE_TREE closeBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, c-1);\r
-\r
-                                                                       //if((char)(openBracket->getText(openBracket)->chars) != '[' &&\r
-                                                                       //      (char)(closeBracket->getText(closeBracket)->chars) != ']')\r
-                                                                       //{\r
-                                                                               Range* range = parseRange(annotation, 1, c);\r
-\r
-                                                                               numberType->setRange(range);\r
-                                                                       //}\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-                               else if(dynamic_cast<StringType*>(type) != NULL)\r
-                               {\r
-                                       StringType* stringType = (StringType*)type;\r
-\r
-                                       for(int i = 1; i < (int)tree->getChildCount(tree); ++i)\r
-                                       {\r
-                                               pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
-\r
-                                               pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);\r
-                                               pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);\r
-\r
-                                               const char* unitName = (char*)unit->getText(unit)->chars;\r
-\r
-                                               if(strEquals(unitName, STR_PATTERN) == true)\r
-                                               {\r
-                                                       std::string strValue((char*)value->getText(value)->chars);\r
-\r
-                                                       strValue = removeQuotes(strValue);\r
-\r
-                                                       StringType* stringType = dynamic_cast<StringType*>(type);\r
-\r
-                                                       if(stringType != NULL)\r
-                                                       {\r
-                                                               stringType->setPattern(strValue);\r
-                                                       }\r
-                                               }\r
-                                               else if(strEquals(unitName, STR_MIMETYPE) == true)\r
-                                               {\r
-                                                       std::string strValue((char*)value->getText(value)->chars);\r
-\r
-                                                       strValue = removeQuotes(strValue);\r
-\r
-                                                       StringType* stringType = dynamic_cast<StringType*>(type);\r
-\r
-                                                       if(stringType != NULL)\r
-                                                       {\r
-                                                               stringType->setMimeType(strValue);\r
-                                                       }\r
-                                               }\r
-                                               //else if(strEquals(idName, STR_LENGTH) == true) // range\r
-                                               //{\r
-                                               //      std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
-\r
-                                               //      StringType* stringType = dynamic_cast<StringType*>(parent);\r
-\r
-                                               //      if(stringType != NULL)\r
-                                               //      {\r
-                                               //              stringType->setLength(strValue);\r
-                                               //      }\r
-                                               //}\r
-                                       }\r
-                               }\r
-                               else if(dynamic_cast<MapType*>(type) != NULL)\r
-                               {\r
-                                       MapType* mapType = (MapType*)type;\r
-\r
-                                       if((int)tree->getChildCount(tree) == 3)\r
-                                       {\r
-                                               pANTLR3_BASE_TREE key = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
-                                               pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)tree->getChild(tree, 2);\r
-\r
-                                               DataType* typeKey = parse(key, mapType);\r
-                                               DataType* typeValue = parse(value, mapType);\r
-\r
-                                               mapType->setKeyType(typeKey);\r
-                                               mapType->setValueType(typeValue);\r
-                                       }\r
-                               }\r
-                               else if(dynamic_cast<OptionalType*>(type) != NULL)\r
-                               {\r
-                                       OptionalType* optionalType = (OptionalType*)type;\r
-\r
-                                       if((int)tree->getChildCount(tree) == 2)\r
-                                       {\r
-                                               pANTLR3_BASE_TREE typeRef = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
-\r
-                                               DataType* dataType = parse(typeRef, optionalType);\r
-\r
-                                               if(dataType != NULL)\r
-                                               {\r
-                                                       optionalType->setComponentType(dataType);\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       //for(int i = 1; i < (int)tree->getChildCount(tree); ++i)\r
-                       //{\r
-                       //      pANTLR3_BASE_TREE parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
-\r
-                       //      parse(parameter, returnType, indent + 1);\r
-                       //}\r
-               }\r
-       }\r
-}\r
+#include "DataBoardRepository.h"
+
+#include "RecordType.h"
+#include "ArrayType.h"
+#include "Constants.h"
+#include "Component.h"
+#include "IntegerType.h"
+#include "DataType.h"
+#include "StringType.h"
+#include "DoubleType.h"
+#include "LongType.h"
+#include "ByteType.h"
+#include "BooleanType.h"
+#include "MapType.h"
+#include "OptionalType.h"
+#include "UnionType.h"
+#include "VariantType.h"
+#include "Range.h"
+#include "Limit.h"
+
+#include <iostream>
+#include <sstream>
+
+namespace Databoard {
+       namespace Type {
+
+               std::string strTypeDefinition::writeOut()
+               {
+                       std::string r;
+                       
+                       r += "type " + name + " = ";
+
+                       r += dataBoard->writeOut();
+
+                       return r;
+               }
+
+               DataBoardRepository::DataBoardRepository()
+               {
+               }
+
+               DataBoardRepository::~DataBoardRepository()
+               {
+                       for(int i = 0; i < (int)dataBoards.size(); ++i)
+                       {
+                               delete dataBoards.at(i).dataBoard;
+                       }
+
+                       dataBoards.clear();
+               }
+
+               void DataBoardRepository::addDataBoard(char* name, DataType* dataBoard)
+               {
+                       strTypeDefinition dataBoard_;
+
+                       dataBoard_.name = std::string(name);
+                       dataBoard_.dataBoard = dataBoard;
+
+                       dataBoards.push_back(dataBoard_);
+               }
+
+               int DataBoardRepository::count()
+               {
+                       return (int)dataBoards.size();
+               }
+
+               strTypeDefinition DataBoardRepository::getDataBoard(int i)
+               {
+                       return dataBoards.at(i);
+               }
+
+               DataType* DataBoardRepository::getDataBoard(std::string name)
+               {
+                       for(int i = 0; i < (int)dataBoards.size(); ++i)
+                       {
+                               if(dataBoards.at(i).name == name)
+                               {
+                                       return dataBoards.at(i).dataBoard;
+                               }
+                       }
+
+                       return NULL;
+               }
+
+               bool DataBoardRepository::open(std::string fileName)
+               {
+                       pANTLR3_INPUT_STREAM input = antlr3AsciiFileStreamNew((pANTLR3_UINT8)fileName.c_str());
+
+                       if ( input == NULL )
+                       {
+                               ANTLR3_FPRINTF(stderr, "string: %s\n", fileName.c_str());
+
+                               return false;
+                       }
+
+                       pSimanticsDataLexer lexer = SimanticsDataLexerNew(input);
+
+                       if ( lexer == NULL )
+                       {
+                               ANTLR3_FPRINTF(stderr, "Unable to create the lexer due to malloc() failure1\n");
+                               //exit(ANTLR3_ERR_NOMEM);
+
+                               return false;
+                       }
+
+                       pANTLR3_COMMON_TOKEN_STREAM tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lexer));//->pLexer->tokSource);
+
+                       if (tstream == NULL)
+                       {
+                               ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate token stream\n");
+                               //exit(ANTLR3_ERR_NOMEM);
+
+                               return false;
+                       }
+
+                       pSimanticsDataParser parser = SimanticsDataParserNew(tstream); // CParserNew is generated by ANTLR3
+
+                       if (parser == NULL)
+                       {
+                               ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate parser\n");
+                               //exit(ANTLR3_ERR_NOMEM);
+
+                               return false;
+                       }
+
+                       SimanticsDataParser_typeDefinitions_return astType = parser->typeDefinitions(parser);
+
+                       bool retValue = true;
+
+                       if(lexer->pLexer->rec->state->errorCount == 0)
+                       {
+                               temporaryname t(this);
+
+                               t.parse(astType.tree);
+                       
+                               //print(astType.tree);
+                       }
+                       else
+                       {
+                               retValue = false;
+                       }
+
+
+                       parser->free(parser);
+                       tstream->free(tstream);
+                       lexer->free(lexer);
+                       input->free(input);
+
+                       return retValue;
+               }
+
+               void DataBoardRepository::print(pANTLR3_BASE_TREE tree, int indent)
+               {
+                       for(int i=0;i<indent;++i)
+                               std::cout << "  ";
+
+                       std::cout << tree->getText(tree)->chars << " " << 
+                               tree->getType(tree) << std::endl;
+
+                       for(int i=0;i<(int)tree->getChildCount(tree);++i)
+                       {
+                               print((pANTLR3_BASE_TREE)tree->getChild(tree, i), indent + 1);
+                       }
+               }
+
+               const strTypeDefinition* DataBoardRepository::get(std::string name)
+               {
+                       for(int i = 0; i < (int)dataBoards.size(); ++i)
+                       {
+                               const strTypeDefinition& dataBoard = dataBoards.at(i); // for debug purposes
+
+                               if(dataBoard.name == name)
+                               {
+                                       return &dataBoard;
+                               }
+                       }
+
+                       return NULL;
+               }
+
+               ///////////////////////////////////////////////
+
+               temporaryname::temporaryname(DataBoardRepository* dataBoardRepository)
+               {
+                       this->dataBoardRepository = dataBoardRepository;
+               }
+
+               temporaryname::~temporaryname()
+               {
+               }
+
+               DataType* temporaryname::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)
+               //DataType* DataBoardRepository::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)
+               //DataType* parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)
+               {
+                       switch(tree->getType(tree)) {
+                               case TYPE_DEFINITIONS:
+                                       {
+                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)
+                                               {
+                                                       parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), parent, indent + 1);
+                                               }
+                                       }
+                                       break;
+                               case TYPE_DEFINITION:
+                                       {
+                                               if(tree->getChildCount(tree) == 2)
+                                               {
+                                                       pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
+                                                       pANTLR3_BASE_TREE type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
+
+                                                       DataType* dataBoard = parse(type, parent, indent+1);
+
+                                                       if(dataBoard != NULL)
+                                                       {
+                                                               dataBoard->setNotBuiltIn();
+
+                                                               if(dataBoardRepository != NULL)
+                                                               {
+                                                                       dataBoardRepository->addDataBoard((char*)id->getText(id)->chars, dataBoard);
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       break;
+                               case TUPLE_TYPE:
+                                       {
+                                               RecordType* record = new RecordType();
+
+                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)
+                                               {
+                                                       DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);
+
+                                                       if(childType != NULL)
+                                                       {
+                                                               std::stringstream ss;
+
+                                                               ss << i;
+
+                                                               std::string tupleId;
+
+                                                               ss >> tupleId;
+
+                                                               addToChildren(record, (char*)tupleId.c_str(), childType);
+                                                       }
+                                               }
+
+                                               return record;
+                                       }
+
+                                       break;
+
+                               case RECORD_TYPE:
+                                       {
+                                               RecordType* record = new RecordType();
+
+                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)
+                                               {
+                                                       DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);
+                                               }
+
+                                               return record;
+                                       }
+
+                                       break;
+                               case ARRAY_TYPE:
+                                       {
+                                               ArrayType* arrayType = new ArrayType();
+
+                                               int childCount = tree->getChildCount(tree);
+
+                                               if(childCount >= 1)
+                                               {
+                                                       DataType* dataType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, 0), parent);
+
+                                                       arrayType->setComponentType(dataType);
+                                                       
+                                                       if(childCount >= 2)
+                                                       {
+                                                               Range* range = parseRange(tree, 1, childCount);
+
+                                                               arrayType->setLength(range);
+                                                       }
+                                               }
+
+                                               return arrayType;
+                                       }
+
+                                       break;
+
+                               case UNION_TYPE:
+                                       {
+                                               UnionType* unionType = new UnionType();
+
+                                               int childCount = tree->getChildCount(tree);
+
+                                               for(int i=0;i<(int)tree->getChildCount(tree);++i)
+                                               {
+                                                       pANTLR3_BASE_TREE p = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
+
+                                                       if(p->getChildCount(p) == 1)
+                                                       {
+                                                               pANTLR3_BASE_TREE t = (pANTLR3_BASE_TREE)p->getChild(p, 0);
+                                                               
+                                                               std::string dataTypeName((char*)t->getText(t)->chars);
+
+                                                               DataType* dataType = NULL;
+
+                                                               if(dataBoardRepository != NULL)
+                                                               {
+                                                                       dataType = dataBoardRepository->getDataBoard(dataTypeName);
+                                                               }
+
+                                                               unionType->addComponent(dataTypeName, dataType);
+                                                       }
+                                               }
+
+                                               return unionType;
+                                       }
+                                       break;
+
+                               case TYPE_COMPONENT:
+                                       {
+                                               pANTLR3_BASE_TREE parameter = NULL;
+                                               pANTLR3_BASE_TREE type = NULL;
+                                               
+                                               if(tree->getChildCount(tree) == 2)
+                                               {
+                                                       parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
+                                                       type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
+                                               }
+
+                                               DataType* returnType = NULL;
+
+                                               if(type != NULL)
+                                               {
+                                                       if(type->getType(type) == TYPE_REFERENCE)
+                                                       {
+                                                               returnType = parse(type, parent, indent + 1);
+                                                       }
+                                                       else if(type->getType(type) == RECORD_TYPE)
+                                                       {
+                                                               returnType = parse(type, parent, indent + 1);
+                                                       }
+                                                       else if(type->getType(type) == TUPLE_TYPE)
+                                                       {
+                                                               returnType = parse(type, parent, indent + 1);
+                                                       }
+                                                       else if(type->getType(type) == ARRAY_TYPE)
+                                                       {
+                                                               returnType = parse(type, parent, indent + 1);
+                                                       }
+                                                       else
+                                                       {
+                                                               //std::cout << "!!" << std::endl;
+                                                               //std::cout << parameter->getText(parameter)->chars << std::endl;
+                                                               //std::cout << parameter->getType(parameter) << std::endl;
+
+                                                               //std::cout << type->getText(type)->chars << std::endl;
+                                                               //std::cout << type->getType(type) << std::endl;
+                                                       }
+                                               }
+
+                                               if(parameter != NULL && returnType != NULL)
+                                               {
+                                                       addToChildren(parent, (char*)parameter->getText(parameter)->chars, returnType);
+                                               }
+
+                                               return returnType;
+
+                                               break;
+                                       }
+                               case TYPE_REFERENCE:
+                                       if(tree->getChildCount(tree) >= 1)
+                                       {
+                                               pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
+
+                                               const char* typeName = (char*)id->getText(id)->chars;
+
+                                               bool errFound = false;
+
+                                               DataType* returnType = NULL;
+
+                                               if(id->getType(id) == ID)
+                                               {
+                                                       if(strEquals(typeName, STR_BOOLEAN) == true)
+                                                       {
+                                                               returnType = new BooleanType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_INTEGER) == true)
+                                                       {
+                                                               returnType = new IntegerType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_DOUBLE) == true)
+                                                       {
+                                                               returnType = new DoubleType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_BYTE) == true)
+                                                       {
+                                                               returnType = new ByteType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_LONG) == true)
+                                                       {
+                                                               returnType = new LongType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_FLOAT) == true)
+                                                       {
+                                                               // double=>float contradiction on purpose
+                                                               returnType = new DoubleType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_STRING) == true)
+                                                       {
+                                                               returnType = new StringType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_MAP) == true)
+                                                       {
+                                                               returnType = new MapType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_OPTIONAL) == true)
+                                                       {
+                                                               returnType = new OptionalType();
+                                                       }
+                                                       else if(strEquals(typeName, STR_VARIANT) == true)
+                                                       {
+                                                               returnType = new VariantType();
+                                                       }
+                                                       else
+                                                       {
+                                                               if(dataBoardRepository != NULL)
+                                                               {
+                                                                       returnType = dataBoardRepository->getDataBoard(typeName);
+                                                               }
+                                                       }
+                                               }
+
+                                               parseParameters(tree, returnType);
+
+                                               //if(errFound == true)
+                                               //{
+                                               //      std::cout << "!-" << std::endl;
+                                               //      std::cout << "unknown: " << typeName << std::endl << std::endl;
+
+                                               //      std::cout << parameter->getText(parameter)->chars << std::endl;
+                                               //      std::cout << parameter->getType(parameter) << std::endl;
+
+                                               //      std::cout << "-!" << std::endl;
+                                               //}
+
+                                               return returnType;
+                                       }
+                                       break;
+                               case TYPE_ANNOTATION:
+                                       if(tree->getChildCount(tree) == 2)
+                                       {
+                                               pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
+                                               pANTLR3_BASE_TREE parameterValue = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
+
+                                               const char* idName = (char*)id->getText(id)->chars;
+
+                                               if(strEquals(idName, STR_UNIT) == true)
+                                               {
+                                                       std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
+
+                                                       NumberType* numberType = dynamic_cast<NumberType*>(parent);
+
+                                                       if(numberType != NULL)
+                                                       {
+                                                               numberType->setUnit(strValue);
+                                                       }
+                                               }
+                                               //else if(strEquals(typeName, STR_RANGE) == true)
+                                               //{
+                                               //}
+                                               else if(strEquals(idName, STR_PATTERN) == true)
+                                               {
+                                                       std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
+
+                                                       StringType* stringType = dynamic_cast<StringType*>(parent);
+
+                                                       if(stringType != NULL)
+                                                       {
+                                                               stringType->setPattern(strValue);
+                                                       }
+                                               }
+                                               else if(strEquals(idName, STR_MIMETYPE) == true)
+                                               {
+                                                       std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
+
+                                                       StringType* stringType = dynamic_cast<StringType*>(parent);
+
+                                                       if(stringType != NULL)
+                                                       {
+                                                               stringType->setMimeType(strValue);
+                                                       }
+                                               }
+                                               //else if(strEquals(idName, STR_LENGTH) == true) // range
+                                               //{
+                                               //      std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
+
+                                               //      StringType* stringType = dynamic_cast<StringType*>(parent);
+
+                                               //      if(stringType != NULL)
+                                               //      {
+                                               //              stringType->setLength(strValue);
+                                               //      }
+                                               //}
+                                       }
+
+                                       break;
+                               case ID:
+                                       parent = parent;
+                                       break;
+
+                               default:
+                                       break;
+                       }
+
+                       return NULL;
+               }
+
+               Range* temporaryname::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)
+               //Range* DataBoardRepository::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)
+               //Range* parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)
+               {
+                       Range* range = new Range();
+
+                       bool rangeLower = true;
+
+                       bool inclusiveLower = true;
+                       bool inclusiveUpper = true;
+
+                       for(int i = minPos;i < maxPos; ++i)
+                       {
+                               pANTLR3_BASE_TREE rangechild = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
+
+                               std::string rangeString((char*)rangechild->getText(rangechild)->chars);
+
+                               if(i == minPos && rangeString == STR_BRACEOPEN)
+                               {
+                                       inclusiveLower = false;
+                               }
+                               else if(i == minPos && rangeString == STR_BRACKETOPEN)
+                               {
+                                       inclusiveLower = true;
+                               }
+                               else if(i == (maxPos-1) && rangeString == STR_BRACECLOSE)
+                               {
+                                       inclusiveUpper = false;
+                               }
+                               else if(i == (maxPos-1) && rangeString == STR_BRACKETCLOSE)
+                               {
+                                       inclusiveUpper = true;
+                               }
+                               else if(rangeString == STR_RANGESPLIT)
+                               {
+                                       rangeLower = false;
+                               }
+                               else
+                               {
+                                       if(rangeLower == true)
+                                       {
+                                               range->setLower(rangeString);
+                                       }
+                                       else
+                                       {
+                                               range->setUpper(rangeString);
+                                       }
+                               }
+                       }
+
+                       if(inclusiveLower == true)
+                       {
+                               range->getLower()->setInclusive();
+                       }
+                       if(inclusiveUpper == true)
+                       {
+                               range->getUpper()->setInclusive();
+                       }
+
+                       // split not received => upper = lower
+                       if(rangeLower == true)
+                       {
+                               range->setUpper(range->getLower()->getValue());
+                       }
+
+                       return range;
+               }
+
+               bool temporaryname::addToChildren(DataType* parent, char* name, DataType* children)
+               //bool DataBoardRepository::addToChildren(DataType* parent, char* name, DataType* children)
+               //bool addToChildren(DataType* parent, char* name, DataType* children)
+               {
+                       //TypeRoot* typeRoot = dynamic_cast<TypeRoot*>(parent);
+
+                       //if(typeRoot != NULL)
+                       //{
+                       //      typeRoot->addDataBoard(name, children);
+
+                       //      return true;
+                       //}
+
+                       RecordType* recordType = dynamic_cast<RecordType*>(parent);
+
+                       if(recordType != NULL)
+                       {
+                               recordType->addComponent(name, children);
+
+                               return true;
+                       }
+
+                       return false;
+               }
+
+               void temporaryname::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)
+               //void DataBoardRepository::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)
+               //void parseParameters(pANTLR3_BASE_TREE tree, DataType* type)
+               {
+                       if((int)tree->getChildCount(tree) >= 2)
+                       {
+                               if(dynamic_cast<NumberType*>(type) != NULL)
+                               {
+                                       NumberType* numberType = (NumberType*)type;
+
+                                       int annotationCount = (int)tree->getChildCount(tree);
+
+                                       if(annotationCount >= 1)
+                                       {
+                                               for(int i = 1; i < annotationCount; ++i)
+                                               {
+                                                       pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
+
+                                                       pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);
+
+                                                       const char* unitName = (char*)unit->getText(unit)->chars;
+
+                                                       if(strEquals(unitName, STR_UNIT) == true)
+                                                       {
+                                                               if((int)annotation->getChildCount(annotation) == 2)
+                                                               {
+                                                                       pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);
+
+                                                                       std::string strValue((char*)value->getText(value)->chars);
+
+                                                                       strValue = removeQuotes(strValue);
+
+                                                                       NumberType* numberType = dynamic_cast<NumberType*>(type);
+
+                                                                       if(numberType != NULL)
+                                                                       {
+                                                                               numberType->setUnit(strValue);
+                                                                       }
+                                                               }
+                                                       }
+                                                       else if(strEquals(unitName, STR_RANGE) == true)
+                                                       {
+                                                               int c = (int)annotation->getChildCount(annotation);
+                                                               // possibilities:
+                                                               // 5: range;[;n;..;]
+                                                               // 5: range;[;..;m;]
+                                                               // 6: range;[;n;..;m;]
+                                                               if(c >= 5)
+                                                               {
+                                                                       //pANTLR3_BASE_TREE openBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);
+                                                                       //pANTLR3_BASE_TREE closeBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, c-1);
+
+                                                                       //if((char)(openBracket->getText(openBracket)->chars) != '[' &&
+                                                                       //      (char)(closeBracket->getText(closeBracket)->chars) != ']')
+                                                                       //{
+                                                                               Range* range = parseRange(annotation, 1, c);
+
+                                                                               numberType->setRange(range);
+                                                                       //}
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                               else if(dynamic_cast<StringType*>(type) != NULL)
+                               {
+                                       StringType* stringType = (StringType*)type;
+
+                                       for(int i = 1; i < (int)tree->getChildCount(tree); ++i)
+                                       {
+                                               pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
+
+                                               pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);
+                                               pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);
+
+                                               const char* unitName = (char*)unit->getText(unit)->chars;
+
+                                               if(strEquals(unitName, STR_PATTERN) == true)
+                                               {
+                                                       std::string strValue((char*)value->getText(value)->chars);
+
+                                                       strValue = removeQuotes(strValue);
+
+                                                       StringType* stringType = dynamic_cast<StringType*>(type);
+
+                                                       if(stringType != NULL)
+                                                       {
+                                                               stringType->setPattern(strValue);
+                                                       }
+                                               }
+                                               else if(strEquals(unitName, STR_MIMETYPE) == true)
+                                               {
+                                                       std::string strValue((char*)value->getText(value)->chars);
+
+                                                       strValue = removeQuotes(strValue);
+
+                                                       StringType* stringType = dynamic_cast<StringType*>(type);
+
+                                                       if(stringType != NULL)
+                                                       {
+                                                               stringType->setMimeType(strValue);
+                                                       }
+                                               }
+                                               //else if(strEquals(idName, STR_LENGTH) == true) // range
+                                               //{
+                                               //      std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
+
+                                               //      StringType* stringType = dynamic_cast<StringType*>(parent);
+
+                                               //      if(stringType != NULL)
+                                               //      {
+                                               //              stringType->setLength(strValue);
+                                               //      }
+                                               //}
+                                       }
+                               }
+                               else if(dynamic_cast<MapType*>(type) != NULL)
+                               {
+                                       MapType* mapType = (MapType*)type;
+
+                                       if((int)tree->getChildCount(tree) == 3)
+                                       {
+                                               pANTLR3_BASE_TREE key = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
+                                               pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)tree->getChild(tree, 2);
+
+                                               DataType* typeKey = parse(key, mapType);
+                                               DataType* typeValue = parse(value, mapType);
+
+                                               mapType->setKeyType(typeKey);
+                                               mapType->setValueType(typeValue);
+                                       }
+                               }
+                               else if(dynamic_cast<OptionalType*>(type) != NULL)
+                               {
+                                       OptionalType* optionalType = (OptionalType*)type;
+
+                                       if((int)tree->getChildCount(tree) == 2)
+                                       {
+                                               pANTLR3_BASE_TREE typeRef = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
+
+                                               DataType* dataType = parse(typeRef, optionalType);
+
+                                               if(dataType != NULL)
+                                               {
+                                                       optionalType->setComponentType(dataType);
+                                               }
+                                       }
+                               }
+                       }
+
+                       //for(int i = 1; i < (int)tree->getChildCount(tree); ++i)
+                       //{
+                       //      pANTLR3_BASE_TREE parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
+
+                       //      parse(parameter, returnType, indent + 1);
+                       //}
+               }
+       }
+}