Can import other files now. (in same directory, use filename without .krak file extention) Right now, still need to compile both files with kraken.

This commit is contained in:
Nathan Braswell
2013-12-31 23:43:49 -06:00
parent 005659b7b7
commit dbf1820428
13 changed files with 203 additions and 116 deletions

View File

@@ -1,7 +1,8 @@
#include "ASTTransformation.h"
ASTTransformation::ASTTransformation() {
ASTTransformation::ASTTransformation(Importer *importerIn) {
//
importer = importerIn;
}
ASTTransformation::~ASTTransformation() {
@@ -28,23 +29,31 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
scope->getDataRef()->scope["-"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["*"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["&"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["=="] = new NodeTree<ASTData>();
scope->getDataRef()->scope["--"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["++"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["=="] = new NodeTree<ASTData>();
scope->getDataRef()->scope["<="] = new NodeTree<ASTData>();
scope->getDataRef()->scope[">="] = new NodeTree<ASTData>();
scope->getDataRef()->scope["<"] = new NodeTree<ASTData>();
scope->getDataRef()->scope[">"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["&&"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["||"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["!"] = new NodeTree<ASTData>();
scope->getDataRef()->scope["*="] = new NodeTree<ASTData>();
scope->getDataRef()->scope["+="] = new NodeTree<ASTData>();
scope->getDataRef()->scope["-="] = new NodeTree<ASTData>();
scope->getDataRef()->scope["<"] = new NodeTree<ASTData>();
scope->getDataRef()->scope[">"] = new NodeTree<ASTData>();
} else if (name == "interpreter_directive") {
newNode = new NodeTree<ASTData>(name, ASTData(interpreter_directive));
} else if (name == "import" && !current.isTerminal()) {
newNode = new NodeTree<ASTData>(name, ASTData(import, Symbol(concatSymbolTree(children[0]), true)));
//Add to scope?
//
//
std::string toImport = concatSymbolTree(children[0]);
newNode = new NodeTree<ASTData>(name, ASTData(import, Symbol(toImport, true)));
//Do the imported file too
NodeTree<ASTData>* outsideTranslationUnit = importer->import(toImport + ".krak");
scope->getDataRef()->scope[toImport] = outsideTranslationUnit; //Put this transation_unit in the scope as it's files name
//Now add it to scope
for (auto i = outsideTranslationUnit->getDataRef()->scope.begin(); i != outsideTranslationUnit->getDataRef()->scope.end(); i++)
scope->getDataRef()->scope[i->first] = i->second;
return newNode; // Don't need children of import
} else if (name == "identifier") {
std::string lookupName = concatSymbolTree(children[0]);

View File

@@ -114,7 +114,10 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
return generate(children[1]) + name;
if (name == "*" && children.size() == 2) //Is dereference, not multiplication
return "*(" + generate(children[1]) + ")";
if (name == "+" || name == "-" || name == "*" || name == "/" || name == "==" || name == ">=" || name == "<=" || name == "!=" || name == "<" || name == ">" || name == "%" || name == "+=" || name == "-=" || name == "*=" || name == "/=") {
if (name == "+" || name == "-" || name == "*" || name == "/" || name == "==" || name == ">=" || name == "<=" || name == "!="
|| name == "<" || name == ">" || name == "%" || name == "+=" || name == "-=" || name == "*=" || name == "/=" || name == "||"
|| name == "&&" || name == "!" ) {
return "((" + generate(children[1]) + ")" + name + "(" + generate(children[2]) + "))";
}
output += data.symbol.getName() + "(";

View File

@@ -128,3 +128,8 @@ std::string GraphStructuredStack::toString() {
}
return tostring;
}
void GraphStructuredStack::clear() {
gss.clear();
edges.clear();
}

113
src/Importer.cpp Normal file
View File

@@ -0,0 +1,113 @@
#include "Importer.h"
Importer::Importer(Parser* parserIn) {
//constructor
parser = parserIn;
removeSymbols.push_back(Symbol("WS", false));
removeSymbols.push_back(Symbol("\\(", true));
removeSymbols.push_back(Symbol("\\)", true));
removeSymbols.push_back(Symbol("::", true));
removeSymbols.push_back(Symbol(";", true));
removeSymbols.push_back(Symbol("{", true));
removeSymbols.push_back(Symbol("}", true));
removeSymbols.push_back(Symbol("(", true));
removeSymbols.push_back(Symbol(")", true));
removeSymbols.push_back(Symbol("import", true)); //Don't need the actual text of the symbol
removeSymbols.push_back(Symbol("interpreter_directive", false));
removeSymbols.push_back(Symbol("if", true));
removeSymbols.push_back(Symbol("while", true));
removeSymbols.push_back(Symbol("__if_comp__", true));
removeSymbols.push_back(Symbol("comp_simple_passthrough", true));
collapseSymbols.push_back(Symbol("opt_typed_parameter_list", false));
collapseSymbols.push_back(Symbol("opt_parameter_list", false));
collapseSymbols.push_back(Symbol("opt_import_list", false));
collapseSymbols.push_back(Symbol("import_list", false));
collapseSymbols.push_back(Symbol("statement_list", false));
collapseSymbols.push_back(Symbol("parameter_list", false));
collapseSymbols.push_back(Symbol("typed_parameter_list", false));
collapseSymbols.push_back(Symbol("unorderd_list_part", false));
collapseSymbols.push_back(Symbol("if_comp_pred", false));
}
Importer::~Importer() {
//destructor
}
NodeTree<ASTData>* Importer::import(std::string fileName) {
std::ifstream programInFile;
std::ofstream outFile, outFileTransformed, outFileAST;
std::string outputName = fileName + "out";
programInFile.open(fileName);
if (!programInFile.is_open()) {
std::cout << "Problem opening programInFile " << fileName << "\n";
return NULL;
}
outFile.open(outputName);
if (!outFile.is_open()) {
std::cout << "Probelm opening output file " << outputName << "\n";
return NULL;
}
outFileTransformed.open((outputName + ".transformed.dot").c_str());
if (!outFileTransformed.is_open()) {
std::cout << "Probelm opening second output file " << outputName + ".transformed.dot" << "\n";
return NULL;
}
outFileAST.open((outputName + ".AST.dot").c_str());
if (!outFileAST.is_open()) {
std::cout << "Probelm opening second output file " << outputName + ".AST.dot" << "\n";
return NULL;
}
//ljklj
std::string programInputFileString, line;
while(programInFile.good()) {
getline(programInFile, line);
programInputFileString.append(line+"\n");
}
programInFile.close();
std::cout << programInputFileString << std::endl;
NodeTree<Symbol>* parseTree = parser->parseInput(programInputFileString);
if (parseTree) {
//std::cout << parseTree->DOTGraphString() << std::endl;
outFile << parseTree->DOTGraphString() << std::endl;
} else {
std::cout << "ParseTree returned from parser is NULL!" << std::endl;
}
outFile.close();
//Remove Transformations
for (int i = 0; i < removeSymbols.size(); i++)
parseTree = RemovalTransformation<Symbol>(removeSymbols[i]).transform(parseTree);
//Collapse Transformations
for (int i = 0; i < collapseSymbols.size(); i++)
parseTree = CollapseTransformation<Symbol>(collapseSymbols[i]).transform(parseTree);
if (parseTree) {
outFileTransformed << parseTree->DOTGraphString() << std::endl;
} else {
std::cout << "Tree returned from transformation is NULL!" << std::endl;
}
outFileTransformed.close();
NodeTree<ASTData>* AST = ASTTransformation(this).transform(parseTree);
if (AST) {
outFileAST << AST->DOTGraphString() << std::endl;
} else {
std::cout << "Tree returned from ASTTransformation is NULL!" << std::endl;
}
outFileAST.close();
return AST;
}

View File

@@ -114,3 +114,7 @@ void Lexer::test() {
std::cout << "Lexer tests passed\n";
}
void Lexer::reset() {
currentPosition = 0;
}

View File

@@ -9,6 +9,13 @@ RNGLRParser::~RNGLRParser() {
}
NodeTree<Symbol>* RNGLRParser::parseInput(std::string inputString) {
input.clear();
gss.clear();
while(!toReduce.empty()) toReduce.pop();
while(!toShift.empty()) toReduce.pop();
SPPFStepNodes.clear();
nullableParts.clear();
packedMap.clear();
//Check for no tokens
bool accepting = false;
@@ -27,6 +34,7 @@ NodeTree<Symbol>* RNGLRParser::parseInput(std::string inputString) {
return new NodeTree<Symbol>();
}
lexer.reset();
lexer.setInput(inputString);
//Now fully lex our input because this algorithm was designed in that manner and simplifies this first implementation.
//It could be converted to on-line later.
@@ -42,7 +50,8 @@ NodeTree<Symbol>* RNGLRParser::parseInput(std::string inputString) {
input.push_back(currentToken);
}
std::cout << "\nDone with Lexing\n" << std::endl;
std::cout << "\nDone with Lexing, length:" << input.size() << std::endl;
std::cout << input[0].toString() << std::endl;
// for (int i = 0; i < input.size(); i++)