--- /dev/null
+#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