More AST work. Getting close to fully transforming language as specified by current grammer. (which is a subset of what it will become)
This commit is contained in:
@@ -52,9 +52,9 @@ number = integer | float | double ;
|
|||||||
assignment_statement = identifier WS "=" WS expression ;
|
assignment_statement = identifier WS "=" WS expression ;
|
||||||
|
|
||||||
alphanumeric = alphanumeric numeric | alphanumeric alpha | numeric | alpha ;
|
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 | ;
|
sign = "\+|-" WS | ;
|
||||||
integer = sign numeric | hexadecimal | "null" ;
|
integer = sign numeric | sign hexadecimal | "null" ;
|
||||||
float = sign numeric "." numeric "f" ;
|
float = sign numeric "." numeric "f" ;
|
||||||
double = sign numeric "." numeric | sign numeric "." numeric "d" ;
|
double = sign numeric "." numeric | sign numeric "." numeric "d" ;
|
||||||
bool = "true" | "false" | "True" | "False" ;
|
bool = "true" | "false" | "True" | "False" ;
|
||||||
|
|||||||
1
main.cpp
1
main.cpp
@@ -121,6 +121,7 @@ int main(int argc, char* argv[]) {
|
|||||||
preASTTransforms.push_back(new CollapseTransformation<Symbol>(Symbol("import_list", false)));
|
preASTTransforms.push_back(new CollapseTransformation<Symbol>(Symbol("import_list", false)));
|
||||||
preASTTransforms.push_back(new CollapseTransformation<Symbol>(Symbol("function_list", false)));
|
preASTTransforms.push_back(new CollapseTransformation<Symbol>(Symbol("function_list", false)));
|
||||||
preASTTransforms.push_back(new CollapseTransformation<Symbol>(Symbol("statement_list", false)));
|
preASTTransforms.push_back(new CollapseTransformation<Symbol>(Symbol("statement_list", false)));
|
||||||
|
preASTTransforms.push_back(new CollapseTransformation<Symbol>(Symbol("parameter_list", false)));
|
||||||
|
|
||||||
for (int i = 0; i < preASTTransforms.size(); i++) {
|
for (int i = 0; i < preASTTransforms.size(); i++) {
|
||||||
parseTree = preASTTransforms[i]->transform(parseTree);
|
parseTree = preASTTransforms[i]->transform(parseTree);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from) {
|
|||||||
newNode = new NodeTree<ASTData>(name, ASTData(import, Symbol(concatSymbolTree(children[0]), true)));
|
newNode = new NodeTree<ASTData>(name, ASTData(import, Symbol(concatSymbolTree(children[0]), true)));
|
||||||
return newNode; // Don't need children of import
|
return newNode; // Don't need children of import
|
||||||
} else if (name == "identifier") {
|
} else if (name == "identifier") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(identifier));
|
newNode = new NodeTree<ASTData>(name, ASTData(identifier, Symbol(concatSymbolTree(children[0]), true)));
|
||||||
} else if (name == "function") {
|
} else if (name == "function") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(function, Symbol(concatSymbolTree(children[1]), true), ASTData::strToType(concatSymbolTree(children[0]))));
|
newNode = new NodeTree<ASTData>(name, ASTData(function, Symbol(concatSymbolTree(children[1]), true), ASTData::strToType(concatSymbolTree(children[0]))));
|
||||||
skipChildren.insert(0);
|
skipChildren.insert(0);
|
||||||
@@ -33,16 +33,25 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from) {
|
|||||||
} else if (name == "typed_parameter") {
|
} else if (name == "typed_parameter") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(typed_parameter));
|
newNode = new NodeTree<ASTData>(name, ASTData(typed_parameter));
|
||||||
} else if (name == "expression") {
|
} else if (name == "expression") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(expression));
|
//If this is an actual part of an expression, not just a premoted term
|
||||||
}else if (name == "term") {
|
if (children.size() > 1) {
|
||||||
|
std::string functionCallName = concatSymbolTree(children[1]);
|
||||||
|
newNode = new NodeTree<ASTData>(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 this is an actual part of an expression, not just a premoted factor
|
||||||
if (children.size() > 1) {
|
if (children.size() > 1) {
|
||||||
std::string functionCallName = concatSymbolTree(children[1]);
|
std::string functionCallName = concatSymbolTree(children[1]);
|
||||||
newNode = new NodeTree<ASTData>(functionCallName, ASTData(function_call, Symbol(functionCallName, true)));
|
newNode = new NodeTree<ASTData>(functionCallName, ASTData(function_call, Symbol(functionCallName, true)));
|
||||||
skipChildren.insert(1);
|
skipChildren.insert(1);
|
||||||
} else {
|
} else {
|
||||||
newNode = new NodeTree<ASTData>();
|
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") {
|
} else if (name == "boolean_expression") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(boolean_expression));
|
newNode = new NodeTree<ASTData>(name, ASTData(boolean_expression));
|
||||||
} else if (name == "statement") {
|
} else if (name == "statement") {
|
||||||
@@ -54,9 +63,24 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from) {
|
|||||||
} else if (name == "assignment_statement") {
|
} else if (name == "assignment_statement") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(assignment_statement));
|
newNode = new NodeTree<ASTData>(name, ASTData(assignment_statement));
|
||||||
} else if (name == "function_call") {
|
} else if (name == "function_call") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(function_call));
|
//children[0] is scope
|
||||||
} else if (name == "value") {
|
std::string functionCallName = concatSymbolTree(children[1]);
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(value));
|
newNode = new NodeTree<ASTData>(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<ASTData>(name, ASTData(value, Symbol(concatSymbolTree(children[0]), true), boolean));
|
||||||
|
} else if (name == "number") {
|
||||||
|
return transform(children[0]);
|
||||||
|
} else if (name == "integer") {
|
||||||
|
newNode = new NodeTree<ASTData>(name, ASTData(value, Symbol(concatSymbolTree(from), true), integer));
|
||||||
|
} else if (name == "float") {
|
||||||
|
newNode = new NodeTree<ASTData>(name, ASTData(value, Symbol(concatSymbolTree(from), true), floating));
|
||||||
|
} else if (name == "double") {
|
||||||
|
newNode = new NodeTree<ASTData>(name, ASTData(value, Symbol(concatSymbolTree(from), true), double_percision));
|
||||||
|
} else if (name == "string") {
|
||||||
|
newNode = new NodeTree<ASTData>(name, ASTData(value, Symbol(concatSymbolTree(children[0]), true), char_string));
|
||||||
} else {
|
} else {
|
||||||
return new NodeTree<ASTData>();
|
return new NodeTree<ASTData>();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user