1 #include "DataBoardRepository.h"
\r
3 #include "RecordType.h"
\r
4 #include "ArrayType.h"
\r
5 #include "Constants.h"
\r
6 #include "Component.h"
\r
7 #include "IntegerType.h"
\r
8 #include "DataType.h"
\r
9 #include "StringType.h"
\r
10 #include "DoubleType.h"
\r
11 #include "LongType.h"
\r
12 #include "ByteType.h"
\r
13 #include "BooleanType.h"
\r
14 #include "MapType.h"
\r
15 #include "OptionalType.h"
\r
16 #include "UnionType.h"
\r
17 #include "VariantType.h"
\r
24 namespace Databoard {
\r
27 std::string strTypeDefinition::writeOut()
\r
31 r += "type " + name + " = ";
\r
33 r += dataBoard->writeOut();
\r
38 DataBoardRepository::DataBoardRepository()
\r
42 DataBoardRepository::~DataBoardRepository()
\r
44 for(int i = 0; i < (int)dataBoards.size(); ++i)
\r
46 delete dataBoards.at(i).dataBoard;
\r
52 void DataBoardRepository::addDataBoard(char* name, DataType* dataBoard)
\r
54 strTypeDefinition dataBoard_;
\r
56 dataBoard_.name = std::string(name);
\r
57 dataBoard_.dataBoard = dataBoard;
\r
59 dataBoards.push_back(dataBoard_);
\r
62 int DataBoardRepository::count()
\r
64 return (int)dataBoards.size();
\r
67 strTypeDefinition DataBoardRepository::getDataBoard(int i)
\r
69 return dataBoards.at(i);
\r
72 DataType* DataBoardRepository::getDataBoard(std::string name)
\r
74 for(int i = 0; i < (int)dataBoards.size(); ++i)
\r
76 if(dataBoards.at(i).name == name)
\r
78 return dataBoards.at(i).dataBoard;
\r
85 bool DataBoardRepository::open(std::string fileName)
\r
87 pANTLR3_INPUT_STREAM input = antlr3AsciiFileStreamNew((pANTLR3_UINT8)fileName.c_str());
\r
89 if ( input == NULL )
\r
91 ANTLR3_FPRINTF(stderr, "string: %s\n", fileName.c_str());
\r
96 pSimanticsDataLexer lexer = SimanticsDataLexerNew(input);
\r
98 if ( lexer == NULL )
\r
100 ANTLR3_FPRINTF(stderr, "Unable to create the lexer due to malloc() failure1\n");
\r
101 //exit(ANTLR3_ERR_NOMEM);
\r
106 pANTLR3_COMMON_TOKEN_STREAM tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lexer));//->pLexer->tokSource);
\r
108 if (tstream == NULL)
\r
110 ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate token stream\n");
\r
111 //exit(ANTLR3_ERR_NOMEM);
\r
116 pSimanticsDataParser parser = SimanticsDataParserNew(tstream); // CParserNew is generated by ANTLR3
\r
118 if (parser == NULL)
\r
120 ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate parser\n");
\r
121 //exit(ANTLR3_ERR_NOMEM);
\r
126 SimanticsDataParser_typeDefinitions_return astType = parser->typeDefinitions(parser);
\r
128 bool retValue = true;
\r
130 if(lexer->pLexer->rec->state->errorCount == 0)
\r
132 temporaryname t(this);
\r
134 t.parse(astType.tree);
\r
136 //print(astType.tree);
\r
144 parser->free(parser);
\r
145 tstream->free(tstream);
\r
146 lexer->free(lexer);
\r
147 input->free(input);
\r
152 void DataBoardRepository::print(pANTLR3_BASE_TREE tree, int indent)
\r
154 for(int i=0;i<indent;++i)
\r
157 std::cout << tree->getText(tree)->chars << " " <<
\r
158 tree->getType(tree) << std::endl;
\r
160 for(int i=0;i<(int)tree->getChildCount(tree);++i)
\r
162 print((pANTLR3_BASE_TREE)tree->getChild(tree, i), indent + 1);
\r
166 const strTypeDefinition* DataBoardRepository::get(std::string name)
\r
168 for(int i = 0; i < (int)dataBoards.size(); ++i)
\r
170 const strTypeDefinition& dataBoard = dataBoards.at(i); // for debug purposes
\r
172 if(dataBoard.name == name)
\r
181 ///////////////////////////////////////////////
\r
183 temporaryname::temporaryname(DataBoardRepository* dataBoardRepository)
\r
185 this->dataBoardRepository = dataBoardRepository;
\r
188 temporaryname::~temporaryname()
\r
192 DataType* temporaryname::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)
\r
193 //DataType* DataBoardRepository::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)
\r
194 //DataType* parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)
\r
196 switch(tree->getType(tree)) {
\r
197 case TYPE_DEFINITIONS:
\r
199 for(int i=0;i<(int)tree->getChildCount(tree);++i)
\r
201 parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), parent, indent + 1);
\r
205 case TYPE_DEFINITION:
\r
207 if(tree->getChildCount(tree) == 2)
\r
209 pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
\r
210 pANTLR3_BASE_TREE type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
\r
212 DataType* dataBoard = parse(type, parent, indent+1);
\r
214 if(dataBoard != NULL)
\r
216 dataBoard->setNotBuiltIn();
\r
218 if(dataBoardRepository != NULL)
\r
220 dataBoardRepository->addDataBoard((char*)id->getText(id)->chars, dataBoard);
\r
228 RecordType* record = new RecordType();
\r
230 for(int i=0;i<(int)tree->getChildCount(tree);++i)
\r
232 DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);
\r
234 if(childType != NULL)
\r
236 std::stringstream ss;
\r
240 std::string tupleId;
\r
244 addToChildren(record, (char*)tupleId.c_str(), childType);
\r
255 RecordType* record = new RecordType();
\r
257 for(int i=0;i<(int)tree->getChildCount(tree);++i)
\r
259 DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);
\r
268 ArrayType* arrayType = new ArrayType();
\r
270 int childCount = tree->getChildCount(tree);
\r
272 if(childCount >= 1)
\r
274 DataType* dataType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, 0), parent);
\r
276 arrayType->setComponentType(dataType);
\r
278 if(childCount >= 2)
\r
280 Range* range = parseRange(tree, 1, childCount);
\r
282 arrayType->setLength(range);
\r
293 UnionType* unionType = new UnionType();
\r
295 int childCount = tree->getChildCount(tree);
\r
297 for(int i=0;i<(int)tree->getChildCount(tree);++i)
\r
299 pANTLR3_BASE_TREE p = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
\r
301 if(p->getChildCount(p) == 1)
\r
303 pANTLR3_BASE_TREE t = (pANTLR3_BASE_TREE)p->getChild(p, 0);
\r
305 std::string dataTypeName((char*)t->getText(t)->chars);
\r
307 DataType* dataType = NULL;
\r
309 if(dataBoardRepository != NULL)
\r
311 dataType = dataBoardRepository->getDataBoard(dataTypeName);
\r
314 unionType->addComponent(dataTypeName, dataType);
\r
322 case TYPE_COMPONENT:
\r
324 pANTLR3_BASE_TREE parameter = NULL;
\r
325 pANTLR3_BASE_TREE type = NULL;
\r
327 if(tree->getChildCount(tree) == 2)
\r
329 parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
\r
330 type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
\r
333 DataType* returnType = NULL;
\r
337 if(type->getType(type) == TYPE_REFERENCE)
\r
339 returnType = parse(type, parent, indent + 1);
\r
341 else if(type->getType(type) == RECORD_TYPE)
\r
343 returnType = parse(type, parent, indent + 1);
\r
345 else if(type->getType(type) == TUPLE_TYPE)
\r
347 returnType = parse(type, parent, indent + 1);
\r
349 else if(type->getType(type) == ARRAY_TYPE)
\r
351 returnType = parse(type, parent, indent + 1);
\r
355 //std::cout << "!!" << std::endl;
\r
356 //std::cout << parameter->getText(parameter)->chars << std::endl;
\r
357 //std::cout << parameter->getType(parameter) << std::endl;
\r
359 //std::cout << type->getText(type)->chars << std::endl;
\r
360 //std::cout << type->getType(type) << std::endl;
\r
364 if(parameter != NULL && returnType != NULL)
\r
366 addToChildren(parent, (char*)parameter->getText(parameter)->chars, returnType);
\r
373 case TYPE_REFERENCE:
\r
374 if(tree->getChildCount(tree) >= 1)
\r
376 pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
\r
378 const char* typeName = (char*)id->getText(id)->chars;
\r
380 bool errFound = false;
\r
382 DataType* returnType = NULL;
\r
384 if(id->getType(id) == ID)
\r
386 if(strEquals(typeName, STR_BOOLEAN) == true)
\r
388 returnType = new BooleanType();
\r
390 else if(strEquals(typeName, STR_INTEGER) == true)
\r
392 returnType = new IntegerType();
\r
394 else if(strEquals(typeName, STR_DOUBLE) == true)
\r
396 returnType = new DoubleType();
\r
398 else if(strEquals(typeName, STR_BYTE) == true)
\r
400 returnType = new ByteType();
\r
402 else if(strEquals(typeName, STR_LONG) == true)
\r
404 returnType = new LongType();
\r
406 else if(strEquals(typeName, STR_FLOAT) == true)
\r
408 // double=>float contradiction on purpose
\r
409 returnType = new DoubleType();
\r
411 else if(strEquals(typeName, STR_STRING) == true)
\r
413 returnType = new StringType();
\r
415 else if(strEquals(typeName, STR_MAP) == true)
\r
417 returnType = new MapType();
\r
419 else if(strEquals(typeName, STR_OPTIONAL) == true)
\r
421 returnType = new OptionalType();
\r
423 else if(strEquals(typeName, STR_VARIANT) == true)
\r
425 returnType = new VariantType();
\r
429 if(dataBoardRepository != NULL)
\r
431 returnType = dataBoardRepository->getDataBoard(typeName);
\r
436 parseParameters(tree, returnType);
\r
438 //if(errFound == true)
\r
440 // std::cout << "!-" << std::endl;
\r
441 // std::cout << "unknown: " << typeName << std::endl << std::endl;
\r
443 // std::cout << parameter->getText(parameter)->chars << std::endl;
\r
444 // std::cout << parameter->getType(parameter) << std::endl;
\r
446 // std::cout << "-!" << std::endl;
\r
452 case TYPE_ANNOTATION:
\r
453 if(tree->getChildCount(tree) == 2)
\r
455 pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);
\r
456 pANTLR3_BASE_TREE parameterValue = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
\r
458 const char* idName = (char*)id->getText(id)->chars;
\r
460 if(strEquals(idName, STR_UNIT) == true)
\r
462 std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
\r
464 NumberType* numberType = dynamic_cast<NumberType*>(parent);
\r
466 if(numberType != NULL)
\r
468 numberType->setUnit(strValue);
\r
471 //else if(strEquals(typeName, STR_RANGE) == true)
\r
474 else if(strEquals(idName, STR_PATTERN) == true)
\r
476 std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
\r
478 StringType* stringType = dynamic_cast<StringType*>(parent);
\r
480 if(stringType != NULL)
\r
482 stringType->setPattern(strValue);
\r
485 else if(strEquals(idName, STR_MIMETYPE) == true)
\r
487 std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
\r
489 StringType* stringType = dynamic_cast<StringType*>(parent);
\r
491 if(stringType != NULL)
\r
493 stringType->setMimeType(strValue);
\r
496 //else if(strEquals(idName, STR_LENGTH) == true) // range
\r
498 // std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
\r
500 // StringType* stringType = dynamic_cast<StringType*>(parent);
\r
502 // if(stringType != NULL)
\r
504 // stringType->setLength(strValue);
\r
521 Range* temporaryname::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)
\r
522 //Range* DataBoardRepository::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)
\r
523 //Range* parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)
\r
525 Range* range = new Range();
\r
527 bool rangeLower = true;
\r
529 bool inclusiveLower = true;
\r
530 bool inclusiveUpper = true;
\r
532 for(int i = minPos;i < maxPos; ++i)
\r
534 pANTLR3_BASE_TREE rangechild = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
\r
536 std::string rangeString((char*)rangechild->getText(rangechild)->chars);
\r
538 if(i == minPos && rangeString == STR_BRACEOPEN)
\r
540 inclusiveLower = false;
\r
542 else if(i == minPos && rangeString == STR_BRACKETOPEN)
\r
544 inclusiveLower = true;
\r
546 else if(i == (maxPos-1) && rangeString == STR_BRACECLOSE)
\r
548 inclusiveUpper = false;
\r
550 else if(i == (maxPos-1) && rangeString == STR_BRACKETCLOSE)
\r
552 inclusiveUpper = true;
\r
554 else if(rangeString == STR_RANGESPLIT)
\r
556 rangeLower = false;
\r
560 if(rangeLower == true)
\r
562 range->setLower(rangeString);
\r
566 range->setUpper(rangeString);
\r
571 if(inclusiveLower == true)
\r
573 range->getLower()->setInclusive();
\r
575 if(inclusiveUpper == true)
\r
577 range->getUpper()->setInclusive();
\r
580 // split not received => upper = lower
\r
581 if(rangeLower == true)
\r
583 range->setUpper(range->getLower()->getValue());
\r
589 bool temporaryname::addToChildren(DataType* parent, char* name, DataType* children)
\r
590 //bool DataBoardRepository::addToChildren(DataType* parent, char* name, DataType* children)
\r
591 //bool addToChildren(DataType* parent, char* name, DataType* children)
\r
593 //TypeRoot* typeRoot = dynamic_cast<TypeRoot*>(parent);
\r
595 //if(typeRoot != NULL)
\r
597 // typeRoot->addDataBoard(name, children);
\r
602 RecordType* recordType = dynamic_cast<RecordType*>(parent);
\r
604 if(recordType != NULL)
\r
606 recordType->addComponent(name, children);
\r
614 void temporaryname::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)
\r
615 //void DataBoardRepository::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)
\r
616 //void parseParameters(pANTLR3_BASE_TREE tree, DataType* type)
\r
618 if((int)tree->getChildCount(tree) >= 2)
\r
620 if(dynamic_cast<NumberType*>(type) != NULL)
\r
622 NumberType* numberType = (NumberType*)type;
\r
624 int annotationCount = (int)tree->getChildCount(tree);
\r
626 if(annotationCount >= 1)
\r
628 for(int i = 1; i < annotationCount; ++i)
\r
630 pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
\r
632 pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);
\r
634 const char* unitName = (char*)unit->getText(unit)->chars;
\r
636 if(strEquals(unitName, STR_UNIT) == true)
\r
638 if((int)annotation->getChildCount(annotation) == 2)
\r
640 pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);
\r
642 std::string strValue((char*)value->getText(value)->chars);
\r
644 strValue = removeQuotes(strValue);
\r
646 NumberType* numberType = dynamic_cast<NumberType*>(type);
\r
648 if(numberType != NULL)
\r
650 numberType->setUnit(strValue);
\r
654 else if(strEquals(unitName, STR_RANGE) == true)
\r
656 int c = (int)annotation->getChildCount(annotation);
\r
658 // 5: range;[;n;..;]
\r
659 // 5: range;[;..;m;]
\r
660 // 6: range;[;n;..;m;]
\r
663 //pANTLR3_BASE_TREE openBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);
\r
664 //pANTLR3_BASE_TREE closeBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, c-1);
\r
666 //if((char)(openBracket->getText(openBracket)->chars) != '[' &&
\r
667 // (char)(closeBracket->getText(closeBracket)->chars) != ']')
\r
669 Range* range = parseRange(annotation, 1, c);
\r
671 numberType->setRange(range);
\r
678 else if(dynamic_cast<StringType*>(type) != NULL)
\r
680 StringType* stringType = (StringType*)type;
\r
682 for(int i = 1; i < (int)tree->getChildCount(tree); ++i)
\r
684 pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
\r
686 pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);
\r
687 pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);
\r
689 const char* unitName = (char*)unit->getText(unit)->chars;
\r
691 if(strEquals(unitName, STR_PATTERN) == true)
\r
693 std::string strValue((char*)value->getText(value)->chars);
\r
695 strValue = removeQuotes(strValue);
\r
697 StringType* stringType = dynamic_cast<StringType*>(type);
\r
699 if(stringType != NULL)
\r
701 stringType->setPattern(strValue);
\r
704 else if(strEquals(unitName, STR_MIMETYPE) == true)
\r
706 std::string strValue((char*)value->getText(value)->chars);
\r
708 strValue = removeQuotes(strValue);
\r
710 StringType* stringType = dynamic_cast<StringType*>(type);
\r
712 if(stringType != NULL)
\r
714 stringType->setMimeType(strValue);
\r
717 //else if(strEquals(idName, STR_LENGTH) == true) // range
\r
719 // std::string strValue((char*)parameterValue->getText(parameterValue)->chars);
\r
721 // StringType* stringType = dynamic_cast<StringType*>(parent);
\r
723 // if(stringType != NULL)
\r
725 // stringType->setLength(strValue);
\r
730 else if(dynamic_cast<MapType*>(type) != NULL)
\r
732 MapType* mapType = (MapType*)type;
\r
734 if((int)tree->getChildCount(tree) == 3)
\r
736 pANTLR3_BASE_TREE key = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
\r
737 pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)tree->getChild(tree, 2);
\r
739 DataType* typeKey = parse(key, mapType);
\r
740 DataType* typeValue = parse(value, mapType);
\r
742 mapType->setKeyType(typeKey);
\r
743 mapType->setValueType(typeValue);
\r
746 else if(dynamic_cast<OptionalType*>(type) != NULL)
\r
748 OptionalType* optionalType = (OptionalType*)type;
\r
750 if((int)tree->getChildCount(tree) == 2)
\r
752 pANTLR3_BASE_TREE typeRef = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);
\r
754 DataType* dataType = parse(typeRef, optionalType);
\r
756 if(dataType != NULL)
\r
758 optionalType->setComponentType(dataType);
\r
764 //for(int i = 1; i < (int)tree->getChildCount(tree); ++i)
\r
766 // pANTLR3_BASE_TREE parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, i);
\r
768 // parse(parameter, returnType, indent + 1);
\r