From ebe6b3520a4d08cd7a19a5c872dcabbc3ed5cd9f Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Sat, 26 Oct 2013 15:05:42 -0400 Subject: [PATCH] More AST work. Getting close to fully transforming language as specified by current grammer. (which is a subset of what it will become) --- krakenGrammer.kgm | 4 ++-- main.cpp | 1 + src/ASTTransformation.cpp | 38 +++++++++++++++++++++++++++++++------- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/krakenGrammer.kgm b/krakenGrammer.kgm index 1b275f1..0c42b82 100644 --- a/krakenGrammer.kgm +++ b/krakenGrammer.kgm @@ -52,9 +52,9 @@ number = integer | float | double ; assignment_statement = identifier WS "=" WS expression ; alphanumeric = alphanumeric numeric | alphanumeric alpha | numeric | alpha ; -hexadecimal = sign WS "0x(1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)+" ; +hexadecimal = "0x(1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)+" ; sign = "\+|-" WS | ; -integer = sign numeric | hexadecimal | "null" ; +integer = sign numeric | sign hexadecimal | "null" ; float = sign numeric "." numeric "f" ; double = sign numeric "." numeric | sign numeric "." numeric "d" ; bool = "true" | "false" | "True" | "False" ; diff --git a/main.cpp b/main.cpp index 1aa0c58..1c1bf8e 100644 --- a/main.cpp +++ b/main.cpp @@ -121,6 +121,7 @@ int main(int argc, char* argv[]) { preASTTransforms.push_back(new CollapseTransformation(Symbol("import_list", false))); preASTTransforms.push_back(new CollapseTransformation(Symbol("function_list", false))); preASTTransforms.push_back(new CollapseTransformation(Symbol("statement_list", false))); + preASTTransforms.push_back(new CollapseTransformation(Symbol("parameter_list", false))); for (int i = 0; i < preASTTransforms.size(); i++) { parseTree = preASTTransforms[i]->transform(parseTree); diff --git a/src/ASTTransformation.cpp b/src/ASTTransformation.cpp index 364c303..44932c2 100644 --- a/src/ASTTransformation.cpp +++ b/src/ASTTransformation.cpp @@ -23,7 +23,7 @@ NodeTree* ASTTransformation::transform(NodeTree* from) { newNode = new NodeTree(name, ASTData(import, Symbol(concatSymbolTree(children[0]), true))); return newNode; // Don't need children of import } else if (name == "identifier") { - newNode = new NodeTree(name, ASTData(identifier)); + newNode = new NodeTree(name, ASTData(identifier, Symbol(concatSymbolTree(children[0]), true))); } else if (name == "function") { newNode = new NodeTree(name, ASTData(function, Symbol(concatSymbolTree(children[1]), true), ASTData::strToType(concatSymbolTree(children[0])))); skipChildren.insert(0); @@ -33,16 +33,25 @@ NodeTree* ASTTransformation::transform(NodeTree* from) { } else if (name == "typed_parameter") { newNode = new NodeTree(name, ASTData(typed_parameter)); } else if (name == "expression") { - newNode = new NodeTree(name, ASTData(expression)); - }else if (name == "term") { + //If this is an actual part of an expression, not just a premoted term + if (children.size() > 1) { + std::string functionCallName = concatSymbolTree(children[1]); + newNode = new NodeTree(functionCallName, ASTData(function_call, Symbol(functionCallName, true))); + skipChildren.insert(1); + } else { + return transform(children[0]); //Just a promoted term, so do child + } + } else if (name == "term") { //If this is an actual part of an expression, not just a premoted factor if (children.size() > 1) { std::string functionCallName = concatSymbolTree(children[1]); newNode = new NodeTree(functionCallName, ASTData(function_call, Symbol(functionCallName, true))); skipChildren.insert(1); } else { - newNode = new NodeTree(); + return transform(children[0]); //Just a promoted factor, so do child } + } else if (name == "factor") { + return transform(children[0]); //Just a premoted number or function call or something, so use it instead } else if (name == "boolean_expression") { newNode = new NodeTree(name, ASTData(boolean_expression)); } else if (name == "statement") { @@ -54,9 +63,24 @@ NodeTree* ASTTransformation::transform(NodeTree* from) { } else if (name == "assignment_statement") { newNode = new NodeTree(name, ASTData(assignment_statement)); } else if (name == "function_call") { - newNode = new NodeTree(name, ASTData(function_call)); - } else if (name == "value") { - newNode = new NodeTree(name, ASTData(value)); + //children[0] is scope + std::string functionCallName = concatSymbolTree(children[1]); + newNode = new NodeTree(functionCallName, ASTData(function_call, Symbol(functionCallName, true))); + skipChildren.insert(1); + } else if (name == "parameter") { + return transform(children[0]); //Don't need a parameter node, just the value + } else if (name == "bool") { + newNode = new NodeTree(name, ASTData(value, Symbol(concatSymbolTree(children[0]), true), boolean)); + } else if (name == "number") { + return transform(children[0]); + } else if (name == "integer") { + newNode = new NodeTree(name, ASTData(value, Symbol(concatSymbolTree(from), true), integer)); + } else if (name == "float") { + newNode = new NodeTree(name, ASTData(value, Symbol(concatSymbolTree(from), true), floating)); + } else if (name == "double") { + newNode = new NodeTree(name, ASTData(value, Symbol(concatSymbolTree(from), true), double_percision)); + } else if (name == "string") { + newNode = new NodeTree(name, ASTData(value, Symbol(concatSymbolTree(children[0]), true), char_string)); } else { return new NodeTree(); }