From 46b9fc8b7f495e954e3a1225db61ab151cc62a49 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Sun, 6 Jul 2014 23:42:25 -0700 Subject: [PATCH] Added ability to add commits the Kraken grammer file. Started work on class traits and else statements. --- krakenGrammer.kgm | 8 ++++++-- src/ASTTransformation.cpp | 8 +++++--- src/Importer.cpp | 2 +- src/Parser.cpp | 18 +++++++++++++++--- stdlib/mem.krak | 8 +++++++- stdlib/vector.krak | 12 +++++++++--- tests/vectorTest.expected_results | 1 + tests/vectorTest.krak | 14 +++++++++++++- 8 files changed, 57 insertions(+), 14 deletions(-) diff --git a/krakenGrammer.kgm b/krakenGrammer.kgm index 02598ac..7b81fe9 100644 --- a/krakenGrammer.kgm +++ b/krakenGrammer.kgm @@ -7,8 +7,12 @@ type = type WS "\*" | "void" | "int" | "float" | "double" | "char" | identifier template_inst = "<" WS type_list WS ">" ; type_list = type_list WS "," WS type | type ; -template_dec = "template" WS "<" WS identifier_list WS ">" ; -identifier_list = identifier_list WS "," WS identifier | identifier ; +#What does that even mean? +#some +# +# +template_dec = "template" WS "<" WS template_param_list WS ">" ; +template_param_list = template_param_list WS "," WS identifier | identifier ; import = "import" WS identifier WS ";" ; diff --git a/src/ASTTransformation.cpp b/src/ASTTransformation.cpp index d50d8dc..63ecabb 100644 --- a/src/ASTTransformation.cpp +++ b/src/ASTTransformation.cpp @@ -503,8 +503,10 @@ NodeTree* ASTTransformation::transform(NodeTree* from, NodeTree } // //Set the value of this function call - if (newNode->getDataRef()->valueType == NULL && rhs->getDataRef()->valueType) - newNode->getDataRef()->valueType = rhs->getDataRef()->valueType; + if (newNode->getDataRef()->valueType == NULL && rhs->getDataRef()->valueType) { + std::cout << "The value type from doFunction was null! (for " << functionCallName << ")" << std::endl; + newNode->getDataRef()->valueType = rhs->getDataRef()->valueType; + } //else // newNode->getDataRef()->valueType = NULL; std::cout << "function call to " << functionCallName << " - " << newNode->getName() << " is now " << newNode->getDataRef()->valueType << std::endl; @@ -754,7 +756,7 @@ NodeTree* ASTTransformation::doFunction(NodeTree* scope, std:: else newType->increaseIndirection(); - newNode->getDataRef()->valueType = newType, std::cout << "Operator " + lookup << " is altering indirection "<< std::endl; + newNode->getDataRef()->valueType = newType, std::cout << "Operator " + lookup << " is altering indirection from " << oldTypes[0].toString() << " to " << newType->toString() << std::endl; } else { newNode->getDataRef()->valueType = function->getDataRef()->valueType, std::cout << "Some other ||" << lookup << "||" << std::endl; } diff --git a/src/Importer.cpp b/src/Importer.cpp index 1706e5b..29eb143 100644 --- a/src/Importer.cpp +++ b/src/Importer.cpp @@ -36,7 +36,7 @@ Importer::Importer(Parser* parserIn, std::vector includePaths) { collapseSymbols.push_back(Symbol("if_comp_pred", false)); collapseSymbols.push_back(Symbol("declaration_block", false)); collapseSymbols.push_back(Symbol("type_list", false)); - collapseSymbols.push_back(Symbol("identifier_list", false)); + collapseSymbols.push_back(Symbol("template_param_list", false)); } Importer::~Importer() { diff --git a/src/Parser.cpp b/src/Parser.cpp index 4a87119..e32a9cf 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -32,10 +32,22 @@ Symbol Parser::getOrAddSymbol(std::string symbolString, bool isTerminal) { void Parser::loadGrammer(std::string grammerInputString) { reader.setString(grammerInputString); - std::string currToken = reader.word(); + std::string currToken = reader.word(false); //Don't truncate so we can find the newline correctly (needed for comments) while(currToken != "") { - //Load the left of the rule + //First, if this starts with a '#', skip this + if (currToken.front() == '#') { + //If this line is more than one token long, eat it + std::cout << "Ate: " << currToken << std::endl; + if (currToken.back() != '\n') + std::cout << "Eating " << reader.line() << " b/c grammer comment" << std::endl; + currToken = reader.word(false); + continue; + } + if (currToken.back() == '\n' || currToken.back() == ' ' || currToken.back() == '\t') + currToken.erase(currToken.size()-1); + + //Load the left of the rule ParseRule* currentRule = new ParseRule(); Symbol leftSide = getOrAddSymbol(currToken, false); //Left handle is never a terminal currentRule->setLeftHandle(leftSide); @@ -76,7 +88,7 @@ void Parser::loadGrammer(std::string grammerInputString) { loadedGrammer.push_back(currentRule); //Get next token - currToken = reader.word(); + currToken = reader.word(false); } //std::cout << "Parsed!\n"; diff --git a/stdlib/mem.krak b/stdlib/mem.krak index e52a85d..c4b30c5 100644 --- a/stdlib/mem.krak +++ b/stdlib/mem.krak @@ -57,5 +57,11 @@ template void delete(T* toDelete, int itemDestructCount) { } template void delete(T* toDelete) { - free(toDelete); + delete(toDelete, true); +} + +template void delete(T* toDelete, bool destruct) { + if (destruct) + toDelete->destruct(); + free(toDelete); } diff --git a/stdlib/vector.krak b/stdlib/vector.krak index 7ab5cc2..ca02a6a 100644 --- a/stdlib/vector.krak +++ b/stdlib/vector.krak @@ -5,7 +5,11 @@ typedef template vector { T *data; int size; int available; - vector *construct() { + bool destroyItems; + + vector *construct(bool destroyItemsIn) { + destroyItems = destroyItemsIn; + return construct(); size = 0; available = 8; data = new(8); @@ -13,8 +17,10 @@ typedef template vector { } void destruct() { - //Destruction of contained data should depend on if the stored things are objects or primitives. - delete(data, size); + if (destroyItems) + delete(data, size); + else + delete(data); } bool resize(int newSize) { diff --git a/tests/vectorTest.expected_results b/tests/vectorTest.expected_results index d472488..2239baa 100644 --- a/tests/vectorTest.expected_results +++ b/tests/vectorTest.expected_results @@ -1,2 +1,3 @@ 1337 +Destroyed! diff --git a/tests/vectorTest.krak b/tests/vectorTest.krak index b55fe50..83d9898 100644 --- a/tests/vectorTest.krak +++ b/tests/vectorTest.krak @@ -1,8 +1,14 @@ import io; import vector; +typedef Destructable { + void destruct() { + println("Destroyed!"); + } +}; + int main() { - vector intVec.construct(); + vector intVec.construct(false); intVec.addBack(1); intVec.addBack(3); intVec.addBack(3); @@ -11,5 +17,11 @@ int main() { print(intVec.at(i)); println(); + + vector* desVec = new>()->construct(true); + Destructable testDestruct; + desVec->addBack(testDestruct); + delete>(desVec); + return 0; }