-#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);
+ //}
+ }
+ }
+}