Working toward new C inline style
This commit is contained in:
@@ -16,7 +16,7 @@ class Type;
|
|||||||
enum ASTType {undef, translation_unit, interpreter_directive, import, identifier, type_def,
|
enum ASTType {undef, translation_unit, interpreter_directive, import, identifier, type_def,
|
||||||
function, code_block, typed_parameter, expression, boolean_expression, statement,
|
function, code_block, typed_parameter, expression, boolean_expression, statement,
|
||||||
if_statement, while_loop, for_loop, return_statement, assignment_statement, declaration_statement,
|
if_statement, while_loop, for_loop, return_statement, assignment_statement, declaration_statement,
|
||||||
if_comp, simple_passthrough, function_call, value};
|
if_comp, simple_passthrough, passthrough_params, function_call, value};
|
||||||
|
|
||||||
class ASTData {
|
class ASTData {
|
||||||
public:
|
public:
|
||||||
@@ -34,4 +34,4 @@ class ASTData {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -47,13 +47,16 @@ class ASTTransformation: public NodeTransformation<Symbol,ASTData> {
|
|||||||
std::vector<NodeTree<ASTData>*> scopeLookup(NodeTree<ASTData>* scope, std::string lookup, bool includeModules, std::vector<NodeTree<ASTData>*> visited);
|
std::vector<NodeTree<ASTData>*> scopeLookup(NodeTree<ASTData>* scope, std::string lookup, bool includeModules, std::vector<NodeTree<ASTData>*> visited);
|
||||||
|
|
||||||
NodeTree<ASTData>* getUpperTranslationUnit(NodeTree<ASTData>* node);
|
NodeTree<ASTData>* getUpperTranslationUnit(NodeTree<ASTData>* node);
|
||||||
|
NodeTree<ASTData>* addToScope(std::string name, NodeTree<ASTData>* toAdd, NodeTree<ASTData>* addTo);
|
||||||
Type* typeFromTypeNode(NodeTree<Symbol>* typeNode, NodeTree<ASTData>* scope, std::map<std::string, Type*> templateTypeReplacements);
|
Type* typeFromTypeNode(NodeTree<Symbol>* typeNode, NodeTree<ASTData>* scope, std::map<std::string, Type*> templateTypeReplacements);
|
||||||
NodeTree<ASTData>* templateClassLookup(NodeTree<ASTData>* scope, std::string name, std::vector<Type*> templateInstantiationTypes);
|
NodeTree<ASTData>* templateClassLookup(NodeTree<ASTData>* scope, std::string name, std::vector<Type*> templateInstantiationTypes);
|
||||||
NodeTree<ASTData>* findOrInstantiateFunctionTemplate(std::vector<NodeTree<Symbol>*> children, NodeTree<ASTData>* scope, std::vector<Type> types, std::map<std::string, Type*> templateTypeReplacements);
|
NodeTree<ASTData>* findOrInstantiateFunctionTemplate(std::vector<NodeTree<Symbol>*> children, NodeTree<ASTData>* scope, std::vector<Type> types, std::map<std::string, Type*> templateTypeReplacements);
|
||||||
std::map<std::string, Type*> makeTemplateFunctionTypeMap(NodeTree<Symbol>* templateNode, std::vector<Type*> types);
|
std::map<std::string, Type*> makeTemplateFunctionTypeMap(NodeTree<Symbol>* templateNode, std::vector<Type*> types);
|
||||||
std::vector<std::pair<std::string, std::set<std::string>>> makeTemplateNameTraitPairs(NodeTree<Symbol>* templateNode);
|
std::vector<std::pair<std::string, std::set<std::string>>> makeTemplateNameTraitPairs(NodeTree<Symbol>* templateNode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Importer * importer;
|
Importer * importer;
|
||||||
|
NodeTree<ASTData>* builtin_trans_unit; // the top scope for language level stuff
|
||||||
std::map<std::string, std::vector<NodeTree<ASTData>*>> languageLevelReservedWords;
|
std::map<std::string, std::vector<NodeTree<ASTData>*>> languageLevelReservedWords;
|
||||||
std::map<std::string, std::vector<NodeTree<ASTData>*>> languageLevelOperators;
|
std::map<std::string, std::vector<NodeTree<ASTData>*>> languageLevelOperators;
|
||||||
NodeTree<ASTData>* topScope; //maintained for templates that need to add themselves to the top scope no matter where they are instantiated
|
NodeTree<ASTData>* topScope; //maintained for templates that need to add themselves to the top scope no matter where they are instantiated
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class CGenerator {
|
|||||||
static std::string ValueTypeToCTypeDecoration(Type *type);
|
static std::string ValueTypeToCTypeDecoration(Type *type);
|
||||||
static std::string ValueTypeToCTypeThingHelper(Type *type, std::string ptrStr);
|
static std::string ValueTypeToCTypeThingHelper(Type *type, std::string ptrStr);
|
||||||
static std::string CifyName(std::string name);
|
static std::string CifyName(std::string name);
|
||||||
|
static std::string scopePrefix(NodeTree<ASTData>* from);
|
||||||
std::string generateObjectMethod(NodeTree<ASTData>* enclosingObject, NodeTree<ASTData>* from, std::string *functionPrototype);
|
std::string generateObjectMethod(NodeTree<ASTData>* enclosingObject, NodeTree<ASTData>* from, std::string *functionPrototype);
|
||||||
NodeTree<ASTData>* getMethodsObjectType(NodeTree<ASTData>* scope, std::string functionName);
|
NodeTree<ASTData>* getMethodsObjectType(NodeTree<ASTData>* scope, std::string functionName);
|
||||||
std::string generatorString;
|
std::string generatorString;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
Goal = translation_unit ;
|
Goal = translation_unit ;
|
||||||
translation_unit = interpreter_directive WS unorderd_list_part WS ;
|
translation_unit = WS unorderd_list_part WS ;
|
||||||
unorderd_list_part = import WS unorderd_list_part | function WS unorderd_list_part | type_def WS SEMI WS unorderd_list_part | if_comp WS unorderd_list_part | simple_passthrough WS unorderd_list_part | declaration_statement WS SEMI WS unorderd_list_part | import | function | type_def WS SEMI | if_comp | simple_passthrough | declaration_statement WS SEMI ;
|
unorderd_list_part = import WS unorderd_list_part | function WS unorderd_list_part | type_def WS SEMI WS unorderd_list_part | if_comp WS unorderd_list_part | simple_passthrough WS unorderd_list_part | declaration_statement WS SEMI WS unorderd_list_part | import | function | type_def WS SEMI | if_comp | simple_passthrough | declaration_statement WS SEMI ;
|
||||||
|
|
||||||
type = type WS "\*" | "void" | "int" | "float" | "double" | "char" | scoped_identifier | scoped_identifier WS template_inst ;
|
type = type WS "\*" | "void" | "int" | "float" | "double" | "char" | scoped_identifier | scoped_identifier WS template_inst ;
|
||||||
@@ -15,12 +15,6 @@ template_param = identifier WS traits | identifier ;
|
|||||||
import = "import" WS identifier WS SEMI | "import" WS identifier WS ":" WS "\*" WS SEMI | "import" WS identifier WS ":" WS import_list WS SEMI ;
|
import = "import" WS identifier WS SEMI | "import" WS identifier WS ":" WS "\*" WS SEMI | "import" WS identifier WS ":" WS import_list WS SEMI ;
|
||||||
import_list = identifier | identifier WS "," WS import_list ;
|
import_list = identifier | identifier WS "," WS import_list ;
|
||||||
|
|
||||||
interpreter_directive = "#!" WS path | ;
|
|
||||||
path = path path_part | path_part ;
|
|
||||||
path_part = forward_slash alphanumeric | back_slash alphanumeric ;
|
|
||||||
forward_slash = "/" ;
|
|
||||||
back_slash = "\\" ;
|
|
||||||
|
|
||||||
# all for optional semicolons k k
|
# all for optional semicolons k k
|
||||||
line_break = "
|
line_break = "
|
||||||
+" ;
|
+" ;
|
||||||
@@ -33,7 +27,11 @@ SEMI = ";" | line_break | cpp_comment ;
|
|||||||
|
|
||||||
if_comp = "__if_comp__" WS identifier WS if_comp_pred ;
|
if_comp = "__if_comp__" WS identifier WS if_comp_pred ;
|
||||||
if_comp_pred = code_block | simple_passthrough ;
|
if_comp_pred = code_block | simple_passthrough ;
|
||||||
simple_passthrough = "__simple_passthrough__" WS triple_quoted_string ;
|
simple_passthrough = "simple_passthrough" WS passthrough_params WS triple_quoted_string ;
|
||||||
|
passthrough_params = "\(" WS opt_param_assign_list WS ":" WS opt_param_assign_list WS ":" WS opt_string WS "\)" | ;
|
||||||
|
opt_param_assign_list = param_assign_list | ;
|
||||||
|
param_assign_list = identifier WS "=" WS identifier | identifier WS "=" WS identifier WS "," WS param_assign_list ;
|
||||||
|
opt_string = string | ;
|
||||||
|
|
||||||
triple_quoted_string = "\"\"\"((\"\"(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|\\|a|s|d|f|g|h|j|k|l|;|'|
|
triple_quoted_string = "\"\"\"((\"\"(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|\\|a|s|d|f|g|h|j|k|l|;|'|
|
||||||
|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|Z|X|C|V|B|N|M|<|>|\?| )+)|(\"(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|\\|a|s|d|f|g|h|j|k|l|;|'|
|
|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|Z|X|C|V|B|N|M|<|>|\?| )+)|(\"(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|\\|a|s|d|f|g|h|j|k|l|;|'|
|
||||||
@@ -44,7 +42,8 @@ triple_quoted_string = "\"\"\"((\"\"(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i
|
|||||||
|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|Z|X|C|V|B|N|M|<|>|\?| )+))*\"\"\"" ;
|
|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|Z|X|C|V|B|N|M|<|>|\?| )+))*\"\"\"" ;
|
||||||
|
|
||||||
identifier = alpha | alpha alphanumeric ;
|
identifier = alpha | alpha alphanumeric ;
|
||||||
scoped_identifier = scoped_identifier WS "::" WS identifier | identifier ;
|
scope_op = ":" ":" ;
|
||||||
|
scoped_identifier = scoped_identifier WS scope_op WS identifier | identifier ;
|
||||||
|
|
||||||
#Note that to prevent confilct with nested templates (T<A<B>>) it is a nonterminal contructed as follows
|
#Note that to prevent confilct with nested templates (T<A<B>>) it is a nonterminal contructed as follows
|
||||||
right_shift = ">" ">" ;
|
right_shift = ">" ">" ;
|
||||||
@@ -93,7 +92,7 @@ comparator = "==" | "<=" | ">=" | "!=" | "<" | ">" ;
|
|||||||
|
|
||||||
expression = expression WS "<<" WS term | expression WS right_shift WS shiftand | shiftand ;
|
expression = expression WS "<<" WS term | expression WS right_shift WS shiftand | shiftand ;
|
||||||
shiftand = shiftand WS "-" WS term | shiftand WS "\+" WS term | term ;
|
shiftand = shiftand WS "-" WS term | shiftand WS "\+" WS term | term ;
|
||||||
term = term WS forward_slash WS factor | term WS "\*" WS factor | term WS "%" WS factor | factor ;
|
term = term WS "/" WS factor | term WS "\*" WS factor | term WS "%" WS factor | factor ;
|
||||||
factor = "\+\+" WS unarad | unarad WS "\+\+" | "--" WS unarad | unarad WS "--" | "\+" WS unarad | "-" WS unarad | "!" WS unarad | "~" WS unarad | "\(" WS type WS "\)" WS unarad | "\*" WS unarad | "&" WS unarad | unarad ;
|
factor = "\+\+" WS unarad | unarad WS "\+\+" | "--" WS unarad | unarad WS "--" | "\+" WS unarad | "-" WS unarad | "!" WS unarad | "~" WS unarad | "\(" WS type WS "\)" WS unarad | "\*" WS unarad | "&" WS unarad | unarad ;
|
||||||
unarad = number | scoped_identifier | scoped_identifier WS template_inst | function_call | bool | string | character | "\(" WS boolean_expression WS "\)" | access_operation | unarad WS "[" WS expression WS "]" ;
|
unarad = number | scoped_identifier | scoped_identifier WS template_inst | function_call | bool | string | character | "\(" WS boolean_expression WS "\)" | access_operation | unarad WS "[" WS expression WS "]" ;
|
||||||
number = integer | floating_literal ;
|
number = integer | floating_literal ;
|
||||||
@@ -104,10 +103,9 @@ declaration_statement = dec_type WS identifier WS "=" WS boolean_expression | de
|
|||||||
|
|
||||||
alphanumeric = alphanumeric numeric | alphanumeric alpha | numeric | alpha ;
|
alphanumeric = alphanumeric numeric | alphanumeric alpha | numeric | alpha ;
|
||||||
hexadecimal = "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 = numeric | hexadecimal ;
|
||||||
integer = sign numeric | sign hexadecimal ;
|
floating_literal = numeric "." numeric | numeric "." numeric alpha ;
|
||||||
floating_literal = sign numeric "." numeric | sign numeric "." numeric alpha ;
|
bool = "true" | "false" ;
|
||||||
bool = "true" | "false" | "True" | "False" ;
|
|
||||||
character = "'(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|\\|a|s|d|f|g|h|j|k|l|;|'|
|
character = "'(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|\\|a|s|d|f|g|h|j|k|l|;|'|
|
||||||
|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|\"|Z|X|C|V|B|N|M|<|>|\?| )'" ;
|
|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|\"|Z|X|C|V|B|N|M|<|>|\?| )'" ;
|
||||||
alpha = "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|_)+" ;
|
alpha = "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|_)+" ;
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ std::string ASTData::ASTTypeToString(ASTType type) {
|
|||||||
return "if_comp";
|
return "if_comp";
|
||||||
case simple_passthrough:
|
case simple_passthrough:
|
||||||
return "simple_passthrough";
|
return "simple_passthrough";
|
||||||
|
case passthrough_params:
|
||||||
|
return "passthrough_params";
|
||||||
case function_call:
|
case function_call:
|
||||||
return "function_call";
|
return "function_call";
|
||||||
case value:
|
case value:
|
||||||
|
|||||||
@@ -4,34 +4,36 @@ ASTTransformation::ASTTransformation(Importer *importerIn) {
|
|||||||
importer = importerIn;
|
importer = importerIn;
|
||||||
topScope = NULL;
|
topScope = NULL;
|
||||||
|
|
||||||
|
builtin_trans_unit = new NodeTree<ASTData>("translation_unit", ASTData(translation_unit, Symbol("builtin", false)));
|
||||||
|
|
||||||
//Set up language level reserved identifier scope (only this, right now)
|
//Set up language level reserved identifier scope (only this, right now)
|
||||||
languageLevelReservedWords["this"].push_back(new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol("this", true), NULL)));
|
languageLevelReservedWords["this"].push_back(new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol("this", true), NULL)));
|
||||||
|
|
||||||
//Set up language level special scope. (the final scope checked)
|
//Set up language level special scope. (the final scope checked)
|
||||||
//Note the NULL type
|
//Note the NULL type
|
||||||
languageLevelOperators["+"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("+", true), NULL)));
|
languageLevelOperators["+"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("+", true), NULL))));
|
||||||
languageLevelOperators["-"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("-", true), NULL)));
|
languageLevelOperators["-"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("-", true), NULL))));
|
||||||
languageLevelOperators["*"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("*", true), NULL)));
|
languageLevelOperators["*"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("*", true), NULL))));
|
||||||
languageLevelOperators["/"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("/", true), NULL)));
|
languageLevelOperators["/"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("/", true), NULL))));
|
||||||
languageLevelOperators["%"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("%", true), NULL)));
|
languageLevelOperators["%"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("%", true), NULL))));
|
||||||
languageLevelOperators["&"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("&", true), NULL)));
|
languageLevelOperators["&"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("&", true), NULL))));
|
||||||
languageLevelOperators["--"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("--", true), NULL)));
|
languageLevelOperators["--"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("--", true), NULL))));
|
||||||
languageLevelOperators["++"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("++", true), NULL)));
|
languageLevelOperators["++"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("++", true), NULL))));
|
||||||
languageLevelOperators["=="].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("==", true), new Type(boolean))));
|
languageLevelOperators["=="].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("==", true), new Type(boolean)))));
|
||||||
languageLevelOperators["!="].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("!=", true), new Type(boolean))));
|
languageLevelOperators["!="].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("!=", true), new Type(boolean)))));
|
||||||
languageLevelOperators["<="].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("<=", true), new Type(boolean))));
|
languageLevelOperators["<="].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("<=", true), new Type(boolean)))));
|
||||||
languageLevelOperators[">="].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol(">=", true), new Type(boolean))));
|
languageLevelOperators[">="].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol(">=", true), new Type(boolean)))));
|
||||||
languageLevelOperators["<"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("<", true), new Type(boolean))));
|
languageLevelOperators["<"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("<", true), new Type(boolean)))));
|
||||||
languageLevelOperators[">"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol(">", true), new Type(boolean))));
|
languageLevelOperators[">"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol(">", true), new Type(boolean)))));
|
||||||
languageLevelOperators["&&"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("&&", true), new Type(boolean))));
|
languageLevelOperators["&&"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("&&", true), new Type(boolean)))));
|
||||||
languageLevelOperators["||"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("||", true), new Type(boolean))));
|
languageLevelOperators["||"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("||", true), new Type(boolean)))));
|
||||||
languageLevelOperators["!"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("!", true), new Type(boolean))));
|
languageLevelOperators["!"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("!", true), new Type(boolean)))));
|
||||||
languageLevelOperators["*="].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("*=", true), NULL)));
|
languageLevelOperators["*="].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("*=", true), NULL))));
|
||||||
languageLevelOperators["+="].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("+=", true), NULL)));
|
languageLevelOperators["+="].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("+=", true), NULL))));
|
||||||
languageLevelOperators["-="].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("-=", true), NULL)));
|
languageLevelOperators["-="].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("-=", true), NULL))));
|
||||||
languageLevelOperators["."].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol(".", true), NULL)));
|
languageLevelOperators["."].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol(".", true), NULL))));
|
||||||
languageLevelOperators["->"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("->", true), NULL)));
|
languageLevelOperators["->"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("->", true), NULL))));
|
||||||
languageLevelOperators["[]"].push_back(new NodeTree<ASTData>("function", ASTData(function, Symbol("[]", true), NULL)));
|
languageLevelOperators["[]"].push_back(addToScope("~enclosing_scope", builtin_trans_unit, new NodeTree<ASTData>("function", ASTData(function, Symbol("[]", true), NULL))));
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTTransformation::~ASTTransformation() {
|
ASTTransformation::~ASTTransformation() {
|
||||||
@@ -40,7 +42,7 @@ ASTTransformation::~ASTTransformation() {
|
|||||||
|
|
||||||
//First pass defines all type_defs (objects and ailises), and if_comp/simple_passthrough
|
//First pass defines all type_defs (objects and ailises), and if_comp/simple_passthrough
|
||||||
NodeTree<ASTData>* ASTTransformation::firstPass(std::string fileName, NodeTree<Symbol>* parseTree) {
|
NodeTree<ASTData>* ASTTransformation::firstPass(std::string fileName, NodeTree<Symbol>* parseTree) {
|
||||||
NodeTree<ASTData>* translationUnit = new NodeTree<ASTData>("translation_unit", ASTData(translation_unit));
|
NodeTree<ASTData>* translationUnit = new NodeTree<ASTData>("translation_unit", ASTData(translation_unit, Symbol(fileName, false)));
|
||||||
std::vector<NodeTree<Symbol>*> children = parseTree->getChildren();
|
std::vector<NodeTree<Symbol>*> children = parseTree->getChildren();
|
||||||
importer->registerAST(fileName, translationUnit, parseTree); //Register ourselves with the importer.
|
importer->registerAST(fileName, translationUnit, parseTree); //Register ourselves with the importer.
|
||||||
//This puts us in the scope and the list of ASTs that go through all the passes
|
//This puts us in the scope and the list of ASTs that go through all the passes
|
||||||
@@ -53,7 +55,7 @@ NodeTree<ASTData>* ASTTransformation::firstPass(std::string fileName, NodeTree<S
|
|||||||
name = concatSymbolTree(i->getChildren()[1]);
|
name = concatSymbolTree(i->getChildren()[1]);
|
||||||
else //It's not
|
else //It's not
|
||||||
name = concatSymbolTree(i->getChildren()[0]);
|
name = concatSymbolTree(i->getChildren()[0]);
|
||||||
NodeTree<ASTData>* firstDec = new NodeTree<ASTData>("type_def", ASTData(type_def, Symbol(name, true, name)));
|
NodeTree<ASTData>* firstDec = addToScope("~enclosing_scope", translationUnit, new NodeTree<ASTData>("type_def", ASTData(type_def, Symbol(name, true, name))));
|
||||||
//If this is a template, go ahead and set it up. Pass 2 needs templates set up so it can (partially) instantiate them.
|
//If this is a template, go ahead and set it up. Pass 2 needs templates set up so it can (partially) instantiate them.
|
||||||
//So we give this typedef its name without any template types and make its type template_type, and point to this from node.
|
//So we give this typedef its name without any template types and make its type template_type, and point to this from node.
|
||||||
//Then, when this template is instantiated, it will run transform on from with the types filled in.
|
//Then, when this template is instantiated, it will run transform on from with the types filled in.
|
||||||
@@ -74,8 +76,8 @@ NodeTree<ASTData>* ASTTransformation::firstPass(std::string fileName, NodeTree<S
|
|||||||
firstDec->getDataRef()->scope["~enclosing_scope"].push_back(translationUnit);
|
firstDec->getDataRef()->scope["~enclosing_scope"].push_back(translationUnit);
|
||||||
} else if (i->getDataRef()->getName() == "if_comp") {
|
} else if (i->getDataRef()->getName() == "if_comp") {
|
||||||
std::cout << "IF COMP" << std::endl;
|
std::cout << "IF COMP" << std::endl;
|
||||||
NodeTree<ASTData>* newNode = new NodeTree<ASTData>(i->getDataRef()->getName(), ASTData(if_comp));
|
NodeTree<ASTData>* newNode = addToScope("~enclosing_scope", translationUnit, new NodeTree<ASTData>(i->getDataRef()->getName(), ASTData(if_comp)));
|
||||||
newNode->addChild(new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(concatSymbolTree(i->getChildren()[0]),true))));
|
newNode->addChild(addToScope("~enclosing_scope", newNode, new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(concatSymbolTree(i->getChildren()[0]),true)))));
|
||||||
std::set<int> skipChildren;
|
std::set<int> skipChildren;
|
||||||
skipChildren.insert(0); //Don't do the identifier. The identifier lookup will fail. That's why we do it here.
|
skipChildren.insert(0); //Don't do the identifier. The identifier lookup will fail. That's why we do it here.
|
||||||
newNode->addChildren(transformChildren(i->getChildren(), skipChildren, translationUnit, std::vector<Type>(), std::map<std::string, Type*>()));
|
newNode->addChildren(transformChildren(i->getChildren(), skipChildren, translationUnit, std::vector<Type>(), std::map<std::string, Type*>()));
|
||||||
@@ -89,7 +91,7 @@ NodeTree<ASTData>* ASTTransformation::firstPass(std::string fileName, NodeTree<S
|
|||||||
if (i->getDataRef()->getName() == "import") {
|
if (i->getDataRef()->getName() == "import") {
|
||||||
auto importChildren = i->getChildren();
|
auto importChildren = i->getChildren();
|
||||||
std::string toImport = concatSymbolTree(importChildren[0]);
|
std::string toImport = concatSymbolTree(importChildren[0]);
|
||||||
auto importNode = new NodeTree<ASTData>("import", ASTData(import, Symbol(toImport, true)));
|
auto importNode = addToScope("~enclosing_scope", translationUnit, new NodeTree<ASTData>("import", ASTData(import, Symbol(toImport, true))));
|
||||||
translationUnit->addChild(importNode);
|
translationUnit->addChild(importNode);
|
||||||
//Do the imported file too
|
//Do the imported file too
|
||||||
NodeTree<ASTData>* outsideTranslationUnit = importer->importFirstPass(toImport + ".krak");
|
NodeTree<ASTData>* outsideTranslationUnit = importer->importFirstPass(toImport + ".krak");
|
||||||
@@ -185,13 +187,13 @@ void ASTTransformation::secondPassDoClassInsides(NodeTree<ASTData>* typeDef, std
|
|||||||
//This function may need to partially instantiate a class template
|
//This function may need to partially instantiate a class template
|
||||||
NodeTree<ASTData>* ASTTransformation::secondPassDeclaration(NodeTree<Symbol>* from, NodeTree<ASTData>* scope, std::map<std::string, Type*> templateTypeReplacements) {
|
NodeTree<ASTData>* ASTTransformation::secondPassDeclaration(NodeTree<Symbol>* from, NodeTree<ASTData>* scope, std::map<std::string, Type*> templateTypeReplacements) {
|
||||||
//Check here for method call (an error here)
|
//Check here for method call (an error here)
|
||||||
NodeTree<ASTData>* decStmt = new NodeTree<ASTData>("declaration_statement", ASTData(declaration_statement));
|
NodeTree<ASTData>* decStmt = addToScope("~enclosing_scope", scope, new NodeTree<ASTData>("declaration_statement", ASTData(declaration_statement)));
|
||||||
std::string newIdentifierStr = concatSymbolTree(from->getChildren()[1]);
|
std::string newIdentifierStr = concatSymbolTree(from->getChildren()[1]);
|
||||||
Type* identifierType = typeFromTypeNode(from->getChildren()[0], scope, templateTypeReplacements);
|
Type* identifierType = typeFromTypeNode(from->getChildren()[0], scope, templateTypeReplacements);
|
||||||
std::cout << "Declaring an identifier " << newIdentifierStr << " to be of type " << identifierType->toString() << std::endl;
|
std::cout << "Declaring an identifier " << newIdentifierStr << " to be of type " << identifierType->toString() << std::endl;
|
||||||
NodeTree<ASTData>* newIdentifier = new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(newIdentifierStr, true), identifierType));
|
NodeTree<ASTData>* newIdentifier = addToScope("~enclosing_scope", decStmt, new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(newIdentifierStr, true), identifierType)));
|
||||||
scope->getDataRef()->scope[newIdentifierStr].push_back(newIdentifier);
|
//scope->getDataRef()->scope[newIdentifierStr].push_back(newIdentifier);
|
||||||
decStmt->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope(newIdentifierStr, newIdentifier, scope); // NEW WAY!
|
||||||
decStmt->addChild(newIdentifier);
|
decStmt->addChild(newIdentifier);
|
||||||
|
|
||||||
return decStmt;
|
return decStmt;
|
||||||
@@ -206,8 +208,8 @@ NodeTree<ASTData>* ASTTransformation::secondPassFunction(NodeTree<Symbol>* from,
|
|||||||
if (children[0]->getData().getName() == "template_dec") {
|
if (children[0]->getData().getName() == "template_dec") {
|
||||||
functionName = concatSymbolTree(children[2]);
|
functionName = concatSymbolTree(children[2]);
|
||||||
functionDef = new NodeTree<ASTData>("function", ASTData(function, Symbol(functionName, true), new Type(template_type, from)));
|
functionDef = new NodeTree<ASTData>("function", ASTData(function, Symbol(functionName, true), new Type(template_type, from)));
|
||||||
scope->getDataRef()->scope[functionName].push_back(functionDef);
|
addToScope("~enclosing_scope", scope, functionDef);
|
||||||
functionDef->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope(functionName, functionDef, scope);
|
||||||
std::map<std::string, Type*> yetToBeInstantiatedTemplateTypes; //So that template types (like T) that have not been placed yet are found and given
|
std::map<std::string, Type*> yetToBeInstantiatedTemplateTypes; //So that template types (like T) that have not been placed yet are found and given
|
||||||
//a special Type() - baseType = template_type_type
|
//a special Type() - baseType = template_type_type
|
||||||
for (auto i : slice(children[0]->getChildren(), 1, -1, 2)) {//skip commas
|
for (auto i : slice(children[0]->getChildren(), 1, -1, 2)) {//skip commas
|
||||||
@@ -229,8 +231,8 @@ NodeTree<ASTData>* ASTTransformation::secondPassFunction(NodeTree<Symbol>* from,
|
|||||||
}
|
}
|
||||||
functionName = concatSymbolTree(children[1]);
|
functionName = concatSymbolTree(children[1]);
|
||||||
functionDef = new NodeTree<ASTData>("function", ASTData(function, Symbol(functionName, true), typeFromTypeNode(children[0], scope, templateTypeReplacements)));
|
functionDef = new NodeTree<ASTData>("function", ASTData(function, Symbol(functionName, true), typeFromTypeNode(children[0], scope, templateTypeReplacements)));
|
||||||
scope->getDataRef()->scope[functionName].push_back(functionDef);
|
addToScope("~enclosing_scope", scope, functionDef);
|
||||||
functionDef->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope(functionName, functionDef, scope);
|
||||||
//We only do the parameter nodes. We don't do the body yet, as this is the secondPass
|
//We only do the parameter nodes. We don't do the body yet, as this is the secondPass
|
||||||
auto transChildren = transformChildren(slice(children,2,-2), std::set<int>(), functionDef, std::vector<Type>(), templateTypeReplacements);
|
auto transChildren = transformChildren(slice(children,2,-2), std::set<int>(), functionDef, std::vector<Type>(), templateTypeReplacements);
|
||||||
|
|
||||||
@@ -395,8 +397,11 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
}
|
}
|
||||||
newNode->getDataRef()->valueType = objectType; //Type is self-referential since this is the definition
|
newNode->getDataRef()->valueType = objectType; //Type is self-referential since this is the definition
|
||||||
}
|
}
|
||||||
|
// ?? why not this?
|
||||||
//scope->getDataRef()->scope[typeAlias].push_back(newNode);
|
//scope->getDataRef()->scope[typeAlias].push_back(newNode);
|
||||||
newNode->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
//newNode->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
||||||
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
|
|
||||||
|
|
||||||
//Templates are done here. No need to go farther
|
//Templates are done here. No need to go farther
|
||||||
if (children[0]->getData().getName() == "template_dec")
|
if (children[0]->getData().getName() == "template_dec")
|
||||||
@@ -408,8 +413,8 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
if (children[0]->getData().getName() == "template_dec") {
|
if (children[0]->getData().getName() == "template_dec") {
|
||||||
functionName = concatSymbolTree(children[2]);
|
functionName = concatSymbolTree(children[2]);
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(function, Symbol(functionName, true), new Type(template_type, from)));
|
newNode = new NodeTree<ASTData>(name, ASTData(function, Symbol(functionName, true), new Type(template_type, from)));
|
||||||
scope->getDataRef()->scope[functionName].push_back(newNode);
|
addToScope(functionName, newNode, scope);
|
||||||
newNode->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
std::map<std::string, Type*> yetToBeInstantiatedTemplateTypes; //So that template types (like T) that have not been placed yet are found and given
|
std::map<std::string, Type*> yetToBeInstantiatedTemplateTypes; //So that template types (like T) that have not been placed yet are found and given
|
||||||
//a special Type() - baseType = template_type_type
|
//a special Type() - baseType = template_type_type
|
||||||
for (auto i : slice(children[0]->getChildren(), 1, -1, 2)) //skip commas
|
for (auto i : slice(children[0]->getChildren(), 1, -1, 2)) //skip commas
|
||||||
@@ -431,8 +436,8 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
newNode = new NodeTree<ASTData>(name, ASTData(function, Symbol(functionName, true), typeFromTypeNode(children[0], scope, templateTypeReplacements)));
|
newNode = new NodeTree<ASTData>(name, ASTData(function, Symbol(functionName, true), typeFromTypeNode(children[0], scope, templateTypeReplacements)));
|
||||||
skipChildren.insert(0);
|
skipChildren.insert(0);
|
||||||
skipChildren.insert(1);
|
skipChildren.insert(1);
|
||||||
scope->getDataRef()->scope[functionName].push_back(newNode);
|
addToScope(functionName, newNode, scope);
|
||||||
newNode->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
scope = newNode;
|
scope = newNode;
|
||||||
|
|
||||||
// auto transChildren = transformChildren(children, skipChildren, scope, types);
|
// auto transChildren = transformChildren(children, skipChildren, scope, types);
|
||||||
@@ -446,7 +451,7 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
std::cout << "finished function (kinda, not children) " << functionName << std::endl;
|
std::cout << "finished function (kinda, not children) " << functionName << std::endl;
|
||||||
} else if (name == "code_block") {
|
} else if (name == "code_block") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(code_block));
|
newNode = new NodeTree<ASTData>(name, ASTData(code_block));
|
||||||
newNode->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
scope = newNode;
|
scope = newNode;
|
||||||
} else if (name == "typed_parameter") {
|
} else if (name == "typed_parameter") {
|
||||||
//newNode = transform(children[1]); //Transform to get the identifier
|
//newNode = transform(children[1]); //Transform to get the identifier
|
||||||
@@ -454,8 +459,8 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
std::cout << "Doing typed parameter " << parameterName << std::endl;
|
std::cout << "Doing typed parameter " << parameterName << std::endl;
|
||||||
//std::string typeString = concatSymbolTree(children[0]);//Get the type (left child) and set our new identifer to be that type
|
//std::string typeString = concatSymbolTree(children[0]);//Get the type (left child) and set our new identifer to be that type
|
||||||
newNode = new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(parameterName, true), typeFromTypeNode(children[0], scope, templateTypeReplacements)));
|
newNode = new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(parameterName, true), typeFromTypeNode(children[0], scope, templateTypeReplacements)));
|
||||||
scope->getDataRef()->scope[parameterName].push_back(newNode);
|
addToScope(parameterName, newNode, scope);
|
||||||
newNode->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
std::cout << "Done doing typed_parameter " << parameterName << std::endl;
|
std::cout << "Done doing typed_parameter " << parameterName << std::endl;
|
||||||
return newNode;
|
return newNode;
|
||||||
} else if (name == "boolean_expression" || name == "and_boolean_expression" || name == "bool_exp") {
|
} else if (name == "boolean_expression" || name == "and_boolean_expression" || name == "bool_exp") {
|
||||||
@@ -476,6 +481,7 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
// newNode->addChildren(transformedChildren);
|
// newNode->addChildren(transformedChildren);
|
||||||
} else {
|
} else {
|
||||||
//std::cout << children.size() << std::endl;
|
//std::cout << children.size() << std::endl;
|
||||||
|
// XXX What the heck is this
|
||||||
if (children.size() == 0)
|
if (children.size() == 0)
|
||||||
return new NodeTree<ASTData>();
|
return new NodeTree<ASTData>();
|
||||||
return transform(children[0], scope, types, templateTypeReplacements); //Just a promoted term, so do child
|
return transform(children[0], scope, types, templateTypeReplacements); //Just a promoted term, so do child
|
||||||
@@ -539,6 +545,7 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
return transform(children[0], scope, types, templateTypeReplacements); //Just a promoted child, so do it instead
|
return transform(children[0], scope, types, templateTypeReplacements); //Just a promoted child, so do it instead
|
||||||
}
|
}
|
||||||
} else if (name == "statement") {
|
} else if (name == "statement") {
|
||||||
|
//XXX
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(statement));
|
newNode = new NodeTree<ASTData>(name, ASTData(statement));
|
||||||
} else if (name == "if_statement") {
|
} else if (name == "if_statement") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(if_statement));
|
newNode = new NodeTree<ASTData>(name, ASTData(if_statement));
|
||||||
@@ -578,8 +585,9 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
Type* identifierType = typeFromTypeNode(children[0], scope, templateTypeReplacements);
|
Type* identifierType = typeFromTypeNode(children[0], scope, templateTypeReplacements);
|
||||||
std::cout << "Declaring an identifier " << newIdentifierStr << " to be of type " << identifierType->toString() << std::endl;
|
std::cout << "Declaring an identifier " << newIdentifierStr << " to be of type " << identifierType->toString() << std::endl;
|
||||||
NodeTree<ASTData>* newIdentifier = new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(newIdentifierStr, true), identifierType));
|
NodeTree<ASTData>* newIdentifier = new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(newIdentifierStr, true), identifierType));
|
||||||
scope->getDataRef()->scope[newIdentifierStr].push_back(newIdentifier);
|
addToScope(newIdentifierStr, newIdentifier, scope);
|
||||||
newNode->getDataRef()->scope["~enclosing_scope"].push_back(scope);
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
|
addToScope("~enclosing_scope", newNode, newIdentifier);
|
||||||
newNode->addChild(newIdentifier);
|
newNode->addChild(newIdentifier);
|
||||||
|
|
||||||
if (children.size() > 2 && concatSymbolTree(children[2]) == ".") {
|
if (children.size() > 2 && concatSymbolTree(children[2]) == ".") {
|
||||||
@@ -610,10 +618,17 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
return newNode;
|
return newNode;
|
||||||
} else if (name == "if_comp") {
|
} else if (name == "if_comp") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(if_comp));
|
newNode = new NodeTree<ASTData>(name, ASTData(if_comp));
|
||||||
newNode->addChild(new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(concatSymbolTree(children[0]),true))));
|
newNode->addChild(addToScope("~enclosing_scope", scope, new NodeTree<ASTData>("identifier", ASTData(identifier, Symbol(concatSymbolTree(children[0]),true)))));
|
||||||
|
std::cout << "XXX scope is " << scope << std::endl;
|
||||||
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
skipChildren.insert(0); //Don't do the identifier. The identifier lookup will fail. That's why we do it here.
|
skipChildren.insert(0); //Don't do the identifier. The identifier lookup will fail. That's why we do it here.
|
||||||
} else if (name == "simple_passthrough") {
|
} else if (name == "simple_passthrough") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(simple_passthrough));
|
newNode = new NodeTree<ASTData>(name, ASTData(simple_passthrough));
|
||||||
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
|
std::cout << "XXX scope is " << scope << std::endl;
|
||||||
|
} else if (name == "passthrough_params") {
|
||||||
|
newNode = new NodeTree<ASTData>(name, ASTData(passthrough_params));
|
||||||
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
} else if (name == "function_call") {
|
} else if (name == "function_call") {
|
||||||
std::string functionCallName = concatSymbolTree(children[0]);
|
std::string functionCallName = concatSymbolTree(children[0]);
|
||||||
newNode = new NodeTree<ASTData>(functionCallName, ASTData(function_call, Symbol(functionCallName, true)));
|
newNode = new NodeTree<ASTData>(functionCallName, ASTData(function_call, Symbol(functionCallName, true)));
|
||||||
@@ -638,6 +653,7 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from, NodeTree
|
|||||||
} else if (name == "type") {
|
} else if (name == "type") {
|
||||||
std::string theConcat = concatSymbolTree(from); //We have no symbol, so this will concat our children
|
std::string theConcat = concatSymbolTree(from); //We have no symbol, so this will concat our children
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(value, Symbol(theConcat, true), typeFromTypeNode(from, scope, templateTypeReplacements)));
|
newNode = new NodeTree<ASTData>(name, ASTData(value, Symbol(theConcat, true), typeFromTypeNode(from, scope, templateTypeReplacements)));
|
||||||
|
addToScope("~enclosing_scope", scope, newNode);
|
||||||
} else if (name == "number") {
|
} else if (name == "number") {
|
||||||
return transform(children[0], scope, types, templateTypeReplacements);
|
return transform(children[0], scope, types, templateTypeReplacements);
|
||||||
} else if (name == "integer") {
|
} else if (name == "integer") {
|
||||||
@@ -1041,7 +1057,7 @@ std::vector<NodeTree<ASTData>*> ASTTransformation::scopeLookup(NodeTree<ASTData>
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<NodeTree<ASTData>*> ASTTransformation::scopeLookup(NodeTree<ASTData>* scope, std::string lookup, bool includeModules, std::vector<NodeTree<ASTData>*> visited) {
|
std::vector<NodeTree<ASTData>*> ASTTransformation::scopeLookup(NodeTree<ASTData>* scope, std::string lookup, bool includeModules, std::vector<NodeTree<ASTData>*> visited) {
|
||||||
std::cout << "Scp][e looking up " << lookup << std::endl;
|
std::cout << "Scp]|[e looking up " << lookup << std::endl;
|
||||||
// Don't visit this node again when looking for the smae lookup. Note that we don't prevent coming back for the scope operator, as that should be able to come back.
|
// Don't visit this node again when looking for the smae lookup. Note that we don't prevent coming back for the scope operator, as that should be able to come back.
|
||||||
visited.push_back(scope);
|
visited.push_back(scope);
|
||||||
//We first check to see if it's one of the special reserved identifiers (only this, for now) and return early if it is.
|
//We first check to see if it's one of the special reserved identifiers (only this, for now) and return early if it is.
|
||||||
@@ -1241,9 +1257,9 @@ Type* ASTTransformation::typeFromTypeNode(NodeTree<Symbol>* typeNode, NodeTree<A
|
|||||||
//if (topScope != templateHighScope)
|
//if (topScope != templateHighScope)
|
||||||
//templateHighScope->getDataRef()->scope[fullyInstantiatedName].push_back(typeDefinition);
|
//templateHighScope->getDataRef()->scope[fullyInstantiatedName].push_back(typeDefinition);
|
||||||
// We put it in the scope of the template so that it can find itself (as it's scope is its template definition)
|
// We put it in the scope of the template so that it can find itself (as it's scope is its template definition)
|
||||||
templateDefinition->getDataRef()->scope[fullyInstantiatedName].push_back(typeDefinition);
|
addToScope(fullyInstantiatedName, typeDefinition, templateDefinition);
|
||||||
//Note that the instantiated template's scope is the template's definition.
|
//Note that the instantiated template's scope is the template's definition.
|
||||||
typeDefinition->getDataRef()->scope["~enclosing_scope"].push_back(templateDefinition);
|
addToScope("~enclosing_scope", templateDefinition, typeDefinition);
|
||||||
|
|
||||||
// We only partially instantiate templates no matter what now
|
// We only partially instantiate templates no matter what now
|
||||||
// They are all fully instantiated in the loop at the end of the 4th pass
|
// They are all fully instantiated in the loop at the end of the 4th pass
|
||||||
@@ -1326,11 +1342,13 @@ NodeTree<ASTData>* ASTTransformation::findOrInstantiateFunctionTemplate(std::vec
|
|||||||
skipChildren.insert(1);
|
skipChildren.insert(1);
|
||||||
skipChildren.insert(2);
|
skipChildren.insert(2);
|
||||||
//scope->getDataRef()->scope[fullyInstantiatedName].push_back(instantiatedFunction);
|
//scope->getDataRef()->scope[fullyInstantiatedName].push_back(instantiatedFunction);
|
||||||
instantiatedFunction->getDataRef()->scope["~enclosing_scope"].push_back(templateDefinition->getDataRef()->scope["~enclosing_scope"][0]); //Instantiated Template Function's scope is it's template's definition's scope
|
//instantiatedFunction->getDataRef()->scope["~enclosing_scope"].push_back(templateDefinition->getDataRef()->scope["~enclosing_scope"][0]); //Instantiated Template Function's scope is it's template's definition's scope
|
||||||
|
addToScope("~enclosing_scope", templateDefinition->getDataRef()->scope["~enclosing_scope"][0], instantiatedFunction);
|
||||||
// Arrrrrgh this has a hard time working because the functions will need to see their parameter once they are emitted as C.
|
// Arrrrrgh this has a hard time working because the functions will need to see their parameter once they are emitted as C.
|
||||||
// HAHAHAHAHA DOESN'T MATTER ALL ONE C FILE NOW, swap back to old way
|
// HAHAHAHAHA DOESN'T MATTER ALL ONE C FILE NOW, swap back to old way
|
||||||
auto templateTopScope = getUpperTranslationUnit(templateDefinition);
|
auto templateTopScope = getUpperTranslationUnit(templateDefinition);
|
||||||
templateTopScope->getDataRef()->scope[fullyInstantiatedName].push_back(instantiatedFunction);
|
//templateTopScope->getDataRef()->scope[fullyInstantiatedName].push_back(instantiatedFunction);
|
||||||
|
addToScope(fullyInstantiatedName, instantiatedFunction, templateTopScope);
|
||||||
templateTopScope->addChild(instantiatedFunction); // Add this object the the highest scope's
|
templateTopScope->addChild(instantiatedFunction); // Add this object the the highest scope's
|
||||||
//topScope->getDataRef()->scope[fullyInstantiatedName].push_back(instantiatedFunction);
|
//topScope->getDataRef()->scope[fullyInstantiatedName].push_back(instantiatedFunction);
|
||||||
//topScope->addChild(instantiatedFunction); //Add this object the the highest scope's
|
//topScope->addChild(instantiatedFunction); //Add this object the the highest scope's
|
||||||
@@ -1339,7 +1357,12 @@ NodeTree<ASTData>* ASTTransformation::findOrInstantiateFunctionTemplate(std::vec
|
|||||||
instantiatedFunction->addChildren(transformChildren(templateSyntaxTree->getChildren(), skipChildren, instantiatedFunction, std::vector<Type>(), newTemplateTypeReplacement));
|
instantiatedFunction->addChildren(transformChildren(templateSyntaxTree->getChildren(), skipChildren, instantiatedFunction, std::vector<Type>(), newTemplateTypeReplacement));
|
||||||
|
|
||||||
std::cout << "Fully Instantiated function " << functionName << " to " << fullyInstantiatedName << std::endl;
|
std::cout << "Fully Instantiated function " << functionName << " to " << fullyInstantiatedName << std::endl;
|
||||||
|
|
||||||
return instantiatedFunction;
|
return instantiatedFunction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NodeTree<ASTData>* ASTTransformation::addToScope(std::string name, NodeTree<ASTData>* toAdd, NodeTree<ASTData>* addTo) {
|
||||||
|
addTo->getDataRef()->scope[name].push_back(toAdd);
|
||||||
|
return addTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,6 @@ void CGenerator::generateCompSet(std::map<std::string, NodeTree<ASTData>*> ASTs,
|
|||||||
//Generate an entire set of files
|
//Generate an entire set of files
|
||||||
std::string buildString = "#!/bin/sh\ncc -std=c99 ";
|
std::string buildString = "#!/bin/sh\ncc -std=c99 ";
|
||||||
std::cout << "\n\n =====GENERATE PASS===== \n\n" << std::endl;
|
std::cout << "\n\n =====GENERATE PASS===== \n\n" << std::endl;
|
||||||
// This is made earlier now, as we want to put the dot files here too
|
|
||||||
//if (mkdir(("./" + outputName).c_str(), 0755)) {
|
|
||||||
//std::cerr << "\n\n =====GENERATE PASS===== \n\n" << std::endl;
|
|
||||||
//std::cerr << "Could not make directory " << outputName << std::endl;
|
|
||||||
////throw "could not make directory ";
|
|
||||||
//}
|
|
||||||
|
|
||||||
std::cout << "\n\nGenerate pass for: " << outputName << std::endl;
|
std::cout << "\n\nGenerate pass for: " << outputName << std::endl;
|
||||||
buildString += outputName + ".c ";
|
buildString += outputName + ".c ";
|
||||||
std::ofstream outputCFile, outputHFile;
|
std::ofstream outputCFile, outputHFile;
|
||||||
@@ -51,7 +44,7 @@ std::string CGenerator::tabs() {
|
|||||||
std::string CGenerator::generateClassStruct(NodeTree<ASTData>* from) {
|
std::string CGenerator::generateClassStruct(NodeTree<ASTData>* from) {
|
||||||
auto data = from->getData();
|
auto data = from->getData();
|
||||||
auto children = from->getChildren();
|
auto children = from->getChildren();
|
||||||
std::string objectString = "struct __struct_dummy_" + CifyName(data.symbol.getName()) + "__ {\n";
|
std::string objectString = "struct __struct_dummy_" + scopePrefix(from) + CifyName(data.symbol.getName()) + "__ {\n";
|
||||||
tabLevel++;
|
tabLevel++;
|
||||||
for (int i = 0; i < children.size(); i++) {
|
for (int i = 0; i < children.size(); i++) {
|
||||||
std::cout << children[i]->getName() << std::endl;
|
std::cout << children[i]->getName() << std::endl;
|
||||||
@@ -73,7 +66,9 @@ std::string CGenerator::generateAliasChains(std::map<std::string, NodeTree<ASTDa
|
|||||||
if (declarationData->type == type_def
|
if (declarationData->type == type_def
|
||||||
&& declarationData->valueType->typeDefinition != declaration
|
&& declarationData->valueType->typeDefinition != declaration
|
||||||
&& declarationData->valueType->typeDefinition == definition) {
|
&& declarationData->valueType->typeDefinition == definition) {
|
||||||
output += "typedef " + CifyName(definition->getDataRef()->symbol.getName()) + " " + CifyName(declarationData->symbol.getName()) + ";\n";
|
output += "typedef " +
|
||||||
|
scopePrefix(definition) + CifyName(definition->getDataRef()->symbol.getName()) + " " +
|
||||||
|
scopePrefix(declaration) + CifyName(declarationData->symbol.getName()) + ";\n";
|
||||||
// Recursively add the ones that depend on this one
|
// Recursively add the ones that depend on this one
|
||||||
output += generateAliasChains(ASTs, declaration);
|
output += generateAliasChains(ASTs, declaration);
|
||||||
}
|
}
|
||||||
@@ -178,7 +173,7 @@ std::pair<std::string, std::string> CGenerator::generateTranslationUnit(std::str
|
|||||||
ASTData declarationData = declaration->getData();
|
ASTData declarationData = declaration->getData();
|
||||||
switch(declarationData.type) {
|
switch(declarationData.type) {
|
||||||
case identifier:
|
case identifier:
|
||||||
variableDeclarations += ValueTypeToCType(declarationData.valueType) + " " + declarationData.symbol.getName() + "; /*identifier*/\n";
|
variableDeclarations += ValueTypeToCType(declarationData.valueType) + " " + scopePrefix(declaration) + declarationData.symbol.getName() + "; /*identifier*/\n";
|
||||||
variableExternDeclarations += "extern " + ValueTypeToCType(declarationData.valueType) + " " + declarationData.symbol.getName() + "; /*extern identifier*/\n";
|
variableExternDeclarations += "extern " + ValueTypeToCType(declarationData.valueType) + " " + declarationData.symbol.getName() + "; /*extern identifier*/\n";
|
||||||
break;
|
break;
|
||||||
case function:
|
case function:
|
||||||
@@ -196,9 +191,12 @@ std::pair<std::string, std::string> CGenerator::generateTranslationUnit(std::str
|
|||||||
parameters += ValueTypeToCType(decChildren[j]->getData().valueType) + " " + generate(decChildren[j], nullptr);
|
parameters += ValueTypeToCType(decChildren[j]->getData().valueType) + " " + generate(decChildren[j], nullptr);
|
||||||
nameDecoration += "_" + ValueTypeToCTypeDecoration(decChildren[j]->getData().valueType);
|
nameDecoration += "_" + ValueTypeToCTypeDecoration(decChildren[j]->getData().valueType);
|
||||||
}
|
}
|
||||||
functionPrototypes += CifyName(declarationData.symbol.getName() + nameDecoration) + "(" + parameters + "); /*func*/\n";
|
functionPrototypes += scopePrefix(declaration) +
|
||||||
|
CifyName(declarationData.symbol.getName() + nameDecoration) +
|
||||||
|
"(" + parameters + "); /*func*/\n";
|
||||||
// generate function
|
// generate function
|
||||||
std::cout << "Generating " << CifyName(declarationData.symbol.getName()) << std::endl;
|
std::cout << "Generating " << scopePrefix(declaration) +
|
||||||
|
CifyName(declarationData.symbol.getName()) << std::endl;
|
||||||
functionDefinitions += generate(declaration, nullptr);
|
functionDefinitions += generate(declaration, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -213,10 +211,14 @@ std::pair<std::string, std::string> CGenerator::generateTranslationUnit(std::str
|
|||||||
if (declarationData.valueType->typeDefinition)
|
if (declarationData.valueType->typeDefinition)
|
||||||
continue; // Aliases of objects are done with the thing it alises
|
continue; // Aliases of objects are done with the thing it alises
|
||||||
// Otherwise, we're actually a renaming of a primitive, can generate here
|
// Otherwise, we're actually a renaming of a primitive, can generate here
|
||||||
plainTypedefs += "typedef " + ValueTypeToCType(declarationData.valueType) + " " + CifyName(declarationData.symbol.getName()) + ";\n";
|
plainTypedefs += "typedef " + ValueTypeToCType(declarationData.valueType) + " " +
|
||||||
|
scopePrefix(declaration) +
|
||||||
|
CifyName(declarationData.symbol.getName()) + ";\n";
|
||||||
plainTypedefs += generateAliasChains(ASTs, declaration);
|
plainTypedefs += generateAliasChains(ASTs, declaration);
|
||||||
} else {
|
} else {
|
||||||
plainTypedefs += "typedef struct __struct_dummy_" + CifyName(declarationData.symbol.getName()) + "__ " + CifyName(declarationData.symbol.getName()) + ";\n";
|
plainTypedefs += "typedef struct __struct_dummy_" +
|
||||||
|
scopePrefix(declaration) + CifyName(declarationData.symbol.getName()) + "__ " +
|
||||||
|
scopePrefix(declaration) + CifyName(declarationData.symbol.getName()) + ";\n";
|
||||||
functionPrototypes += "/* Method Prototypes for " + declarationData.symbol.getName() + " */\n";
|
functionPrototypes += "/* Method Prototypes for " + declarationData.symbol.getName() + " */\n";
|
||||||
// We use a seperate string for this because we only include it if this is the file we're defined in
|
// We use a seperate string for this because we only include it if this is the file we're defined in
|
||||||
std::string objectFunctionDefinitions = "/* Method Definitions for " + declarationData.symbol.getName() + " */\n";
|
std::string objectFunctionDefinitions = "/* Method Definitions for " + declarationData.symbol.getName() + " */\n";
|
||||||
@@ -278,7 +280,8 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
std::string preName;
|
std::string preName;
|
||||||
if (enclosingObject && enclosingObject->getDataRef()->scope.find(data.symbol.getName()) != enclosingObject->getDataRef()->scope.end())
|
if (enclosingObject && enclosingObject->getDataRef()->scope.find(data.symbol.getName()) != enclosingObject->getDataRef()->scope.end())
|
||||||
preName += "this->";
|
preName += "this->";
|
||||||
return preName + CifyName(data.symbol.getName()); //Cifying does nothing if not an operator overload
|
// we're scope prefixing EVERYTHING
|
||||||
|
return preName + scopePrefix(from) + CifyName(data.symbol.getName()); //Cifying does nothing if not an operator overload
|
||||||
}
|
}
|
||||||
case function:
|
case function:
|
||||||
{
|
{
|
||||||
@@ -292,7 +295,7 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
parameters += ValueTypeToCType(children[j]->getData().valueType) + " " + generate(children[j], enclosingObject);
|
parameters += ValueTypeToCType(children[j]->getData().valueType) + " " + generate(children[j], enclosingObject);
|
||||||
nameDecoration += "_" + ValueTypeToCTypeDecoration(children[j]->getData().valueType);
|
nameDecoration += "_" + ValueTypeToCTypeDecoration(children[j]->getData().valueType);
|
||||||
}
|
}
|
||||||
output += CifyName(data.symbol.getName() + nameDecoration) + "(" + parameters + ")\n" + generate(children[children.size()-1], enclosingObject);
|
output += scopePrefix(from) + CifyName(data.symbol.getName() + nameDecoration) + "(" + parameters + ")\n" + generate(children[children.size()-1], enclosingObject);
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
case code_block:
|
case code_block:
|
||||||
@@ -315,7 +318,7 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
continue;
|
continue;
|
||||||
if (typeDefinition->getDataRef()->scope.find("destruct") == typeDefinition->getDataRef()->scope.end())
|
if (typeDefinition->getDataRef()->scope.find("destruct") == typeDefinition->getDataRef()->scope.end())
|
||||||
continue;
|
continue;
|
||||||
destructorString += tabs() + CifyName(typeDefinition->getDataRef()->symbol.getName())
|
destructorString += tabs() + scopePrefix(from) + CifyName(typeDefinition->getDataRef()->symbol.getName())
|
||||||
+ "__" + "destruct" + "(&" + generate(identifier, enclosingObject) + ");\n";//Call the destructor
|
+ "__" + "destruct" + "(&" + generate(identifier, enclosingObject) + ");\n";//Call the destructor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -370,7 +373,9 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
} else
|
} else
|
||||||
return ValueTypeToCType(children[0]->getData().valueType) + " " + generate(children[0], enclosingObject) + " = " + generate(children[1], enclosingObject) + ";";
|
return ValueTypeToCType(children[0]->getData().valueType) + " " + generate(children[0], enclosingObject) + " = " + generate(children[1], enclosingObject) + ";";
|
||||||
case if_comp:
|
case if_comp:
|
||||||
if (generate(children[0], enclosingObject) == generatorString)
|
// Lol, this doesn't work because the string gets prefixed now
|
||||||
|
//if (generate(children[0], enclosingObject) == generatorString)
|
||||||
|
if (children[0]->getDataRef()->symbol.getName() == generatorString)
|
||||||
return generate(children[1], enclosingObject);
|
return generate(children[1], enclosingObject);
|
||||||
return "";
|
return "";
|
||||||
case simple_passthrough:
|
case simple_passthrough:
|
||||||
@@ -415,7 +420,9 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
std::cout << "Decorating (in access-should be object) " << name << " " << functionDefChildren.size() << std::endl;
|
std::cout << "Decorating (in access-should be object) " << name << " " << functionDefChildren.size() << std::endl;
|
||||||
for (int i = 0; i < (functionDefChildren.size() > 0 ? functionDefChildren.size()-1 : 0); i++)
|
for (int i = 0; i < (functionDefChildren.size() > 0 ? functionDefChildren.size()-1 : 0); i++)
|
||||||
nameDecoration += "_" + ValueTypeToCTypeDecoration(functionDefChildren[i]->getData().valueType);
|
nameDecoration += "_" + ValueTypeToCTypeDecoration(functionDefChildren[i]->getData().valueType);
|
||||||
/*HERE*/ return CifyName(unaliasedTypeDef->getDataRef()->symbol.getName()) +"__" + CifyName(functionName + nameDecoration) + "(" + (name == "." ? "&" : "") + generate(children[1], enclosingObject) + ",";
|
// Note that we only add scoping to the object, as this specifies our member function too
|
||||||
|
/*HERE*/ return scopePrefix(unaliasedTypeDef) + CifyName(unaliasedTypeDef->getDataRef()->symbol.getName()) +"__" +
|
||||||
|
CifyName(functionName + nameDecoration) + "(" + (name == "." ? "&" : "") + generate(children[1], enclosingObject) + ",";
|
||||||
//The comma lets the upper function call know we already started the param list
|
//The comma lets the upper function call know we already started the param list
|
||||||
//Note that we got here from a function call. We just pass up this special case and let them finish with the perentheses
|
//Note that we got here from a function call. We just pass up this special case and let them finish with the perentheses
|
||||||
} else {
|
} else {
|
||||||
@@ -439,11 +446,13 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
nameDecoration += "_" + ValueTypeToCTypeDecoration(functionDefChildren[i]->getData().valueType);
|
nameDecoration += "_" + ValueTypeToCTypeDecoration(functionDefChildren[i]->getData().valueType);
|
||||||
//Check to see if we're inside of an object and this is a method call
|
//Check to see if we're inside of an object and this is a method call
|
||||||
bool isSelfObjectMethod = enclosingObject && contains(enclosingObject->getChildren(), children[0]);
|
bool isSelfObjectMethod = enclosingObject && contains(enclosingObject->getChildren(), children[0]);
|
||||||
if (isSelfObjectMethod)
|
if (isSelfObjectMethod) {
|
||||||
output += CifyName(enclosingObject->getDataRef()->symbol.getName()) +"__";
|
output += scopePrefix(children[0]) + CifyName(enclosingObject->getDataRef()->symbol.getName()) +"__";
|
||||||
/*HERE*/ output += CifyName(name + nameDecoration) + "(";
|
output += CifyName(name + nameDecoration) + "(";
|
||||||
if (isSelfObjectMethod)
|
|
||||||
output += children.size() > 1 ? "this," : "this";
|
output += children.size() > 1 ? "this," : "this";
|
||||||
|
} else {
|
||||||
|
output += scopePrefix(children[0]) + CifyName(name + nameDecoration) + "(";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//This part handles cases where our definition isn't the function definition (that is, it is probabally the return from another function)
|
//This part handles cases where our definition isn't the function definition (that is, it is probabally the return from another function)
|
||||||
@@ -491,7 +500,7 @@ std::string CGenerator::generateObjectMethod(NodeTree<ASTData>* enclosingObject,
|
|||||||
parameters += ", " + ValueTypeToCType(children[i]->getData().valueType) + " " + generate(children[i]);
|
parameters += ", " + ValueTypeToCType(children[i]->getData().valueType) + " " + generate(children[i]);
|
||||||
nameDecoration += "_" + ValueTypeToCTypeDecoration(children[i]->getData().valueType);
|
nameDecoration += "_" + ValueTypeToCTypeDecoration(children[i]->getData().valueType);
|
||||||
}
|
}
|
||||||
std::string functionSignature = "\n" + ValueTypeToCType(data.valueType) + " " + CifyName(enclosingObject->getDataRef()->symbol.getName()) +"__"
|
std::string functionSignature = "\n" + ValueTypeToCType(data.valueType) + " " + scopePrefix(from) + CifyName(enclosingObject->getDataRef()->symbol.getName()) +"__"
|
||||||
+ CifyName(data.symbol.getName()) + nameDecoration + "(" + ValueTypeToCType(&enclosingObjectType)
|
+ CifyName(data.symbol.getName()) + nameDecoration + "(" + ValueTypeToCType(&enclosingObjectType)
|
||||||
+ " this" + parameters + ")";
|
+ " this" + parameters + ")";
|
||||||
*functionPrototype += functionSignature + ";\n";
|
*functionPrototype += functionSignature + ";\n";
|
||||||
@@ -506,7 +515,7 @@ std::string CGenerator::ValueTypeToCTypeThingHelper(Type *type, std::string ptrS
|
|||||||
switch (type->baseType) {
|
switch (type->baseType) {
|
||||||
case none:
|
case none:
|
||||||
if (type->typeDefinition)
|
if (type->typeDefinition)
|
||||||
return_type = CifyName(type->typeDefinition->getDataRef()->symbol.getName());
|
return_type = scopePrefix(type->typeDefinition) + CifyName(type->typeDefinition->getDataRef()->symbol.getName());
|
||||||
else
|
else
|
||||||
return_type = "none";
|
return_type = "none";
|
||||||
break;
|
break;
|
||||||
@@ -589,4 +598,17 @@ std::string CGenerator::CifyName(std::string name) {
|
|||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
// Generate the scope prefix, that is "file_class_" for a method, etc
|
||||||
|
// What do we still need to handle? Packages! But we don't have thoes yet....
|
||||||
|
std::string CGenerator::scopePrefix(NodeTree<ASTData>* from) {
|
||||||
|
//return "";
|
||||||
|
std::string suffix = "_scp_";
|
||||||
|
ASTData data = from->getData();
|
||||||
|
if (data.type == translation_unit)
|
||||||
|
return CifyName(data.symbol.getName()) + suffix;
|
||||||
|
// so we do prefixing for stuff that c doesn't already scope:
|
||||||
|
// different files. That's it for now. Methods are already lowered correctly with their parent object,
|
||||||
|
// that parent object will get scoped. When we add a package system, we'll have to then add their scoping here
|
||||||
|
return scopePrefix(from->getDataRef()->scope["~enclosing_scope"][0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ Importer::Importer(Parser* parserIn, std::vector<std::string> includePaths, std:
|
|||||||
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(";", true));
|
removeSymbols.push_back(Symbol(";", true));
|
||||||
removeSymbols.push_back(Symbol("SEMI", false));
|
removeSymbols.push_back(Symbol("SEMI", false));
|
||||||
removeSymbols.push_back(Symbol("{", true));
|
removeSymbols.push_back(Symbol("{", true));
|
||||||
@@ -30,13 +30,13 @@ Importer::Importer(Parser* parserIn, std::vector<std::string> includePaths, std:
|
|||||||
removeSymbols.push_back(Symbol("if", true));
|
removeSymbols.push_back(Symbol("if", true));
|
||||||
removeSymbols.push_back(Symbol("while", true));
|
removeSymbols.push_back(Symbol("while", true));
|
||||||
removeSymbols.push_back(Symbol("__if_comp__", true));
|
removeSymbols.push_back(Symbol("__if_comp__", true));
|
||||||
removeSymbols.push_back(Symbol("__simple_passthrough__", true));
|
removeSymbols.push_back(Symbol("simple_passthrough", true));
|
||||||
removeSymbols.push_back(Symbol("comp_simple_passthrough", true));
|
removeSymbols.push_back(Symbol("comp_simple_passthrough", true));
|
||||||
removeSymbols.push_back(Symbol("typedef", true));
|
removeSymbols.push_back(Symbol("typedef", true));
|
||||||
removeSymbols.push_back(Symbol("template", true));
|
removeSymbols.push_back(Symbol("template", true));
|
||||||
removeSymbols.push_back(Symbol("\\|", true));
|
removeSymbols.push_back(Symbol("\\|", true));
|
||||||
|
|
||||||
//collapseSymbols.push_back(Symbol("scoped_identifier", false));
|
//collapseSymbols.push_back(Symbol("scoped_identifier", false));
|
||||||
|
collapseSymbols.push_back(Symbol("opt_param_assign_list", false));
|
||||||
collapseSymbols.push_back(Symbol("opt_typed_parameter_list", false));
|
collapseSymbols.push_back(Symbol("opt_typed_parameter_list", false));
|
||||||
collapseSymbols.push_back(Symbol("opt_parameter_list", false));
|
collapseSymbols.push_back(Symbol("opt_parameter_list", false));
|
||||||
collapseSymbols.push_back(Symbol("opt_import_list", false));
|
collapseSymbols.push_back(Symbol("opt_import_list", false));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import string:*;
|
import string:*;
|
||||||
|
|
||||||
__if_comp__ __C__ __simple_passthrough__ """
|
__if_comp__ __C__ simple_passthrough """
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
|
|
||||||
|void| print(|char*| toPrint) {
|
|void| print(|char*| toPrint) {
|
||||||
__if_comp__ __C__ {
|
__if_comp__ __C__ {
|
||||||
__simple_passthrough__ """
|
simple_passthrough(toPrint = toPrint::) """
|
||||||
printf(toPrint);
|
printf(toPrint);
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
|
|
||||||
|void| print(|int| toPrint) {
|
|void| print(|int| toPrint) {
|
||||||
__if_comp__ __C__ {
|
__if_comp__ __C__ {
|
||||||
__simple_passthrough__ """
|
simple_passthrough(toPrint = toPrint::) """
|
||||||
printf("%d", toPrint);
|
printf("%d", toPrint);
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
@@ -46,7 +46,7 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
|
|
||||||
|void| print(|float| toPrint) {
|
|void| print(|float| toPrint) {
|
||||||
__if_comp__ __C__ {
|
__if_comp__ __C__ {
|
||||||
__simple_passthrough__ """
|
simple_passthrough(toPrint = toPrint::) """
|
||||||
printf("%f", toPrint);
|
printf("%f", toPrint);
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
|
|
||||||
|void| print(|double| toPrint) {
|
|void| print(|double| toPrint) {
|
||||||
__if_comp__ __C__ {
|
__if_comp__ __C__ {
|
||||||
__simple_passthrough__ """
|
simple_passthrough(toPrint = toPrint::) """
|
||||||
printf("%f", toPrint);
|
printf("%f", toPrint);
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
__if_comp__ __C__ __simple_passthrough__ """
|
__if_comp__ __C__ simple_passthrough """
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -16,11 +16,11 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
{
|
{
|
||||||
|double| ans = 0;
|
|double| ans = 0;
|
||||||
__if_comp__ __C__{
|
__if_comp__ __C__{
|
||||||
__simple_Passthrough__ """
|
simple_passthrough(arg = arg : ans = ans :) """
|
||||||
ans = atan(arg);
|
ans = atan(arg);
|
||||||
"""
|
"""
|
||||||
}//end C wrapper
|
}//end C wrapper
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}//end atan function
|
}//end atan function
|
||||||
|
|
||||||
@@ -28,11 +28,11 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
{
|
{
|
||||||
|double| ans = 0;
|
|double| ans = 0;
|
||||||
__if_comp__ __C__{
|
__if_comp__ __C__{
|
||||||
__simple_Passthrough__ """
|
simple_passthrough(x = x, y = y : ans = ans :) """
|
||||||
ans = atan2(x,y);
|
ans = atan2(x,y);
|
||||||
"""
|
"""
|
||||||
}//end C wrapper
|
}//end C wrapper
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}//end atan2 function
|
}//end atan2 function
|
||||||
|
|
||||||
@@ -40,11 +40,11 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
{
|
{
|
||||||
|double| ans = 0;
|
|double| ans = 0;
|
||||||
__if_comp__ __C__{
|
__if_comp__ __C__{
|
||||||
__simple_Passthrough__ """
|
simple_passthrough(arg = arg : ans = ans :) """
|
||||||
ans = acos(arg);
|
ans = acos(arg);
|
||||||
"""
|
"""
|
||||||
}//end C wrapper
|
}//end C wrapper
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}//end acos function
|
}//end acos function
|
||||||
|
|
||||||
@@ -52,11 +52,11 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
{
|
{
|
||||||
|double| ans = 0;
|
|double| ans = 0;
|
||||||
__if_comp__ __C__{
|
__if_comp__ __C__{
|
||||||
__simple_Passthrough__ """
|
simple_passthrough(arg = arg : ans = ans :) """
|
||||||
ans = asin(arg);
|
ans = asin(arg);
|
||||||
"""
|
"""
|
||||||
}//end C wrapper
|
}//end C wrapper
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}//end asin function
|
}//end asin function
|
||||||
|
|
||||||
@@ -64,11 +64,11 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
{
|
{
|
||||||
|double| ans = 0;
|
|double| ans = 0;
|
||||||
__if_comp__ __C__{
|
__if_comp__ __C__{
|
||||||
__simple_Passthrough__ """
|
simple_passthrough(arg = arg : ans = ans :) """
|
||||||
ans = tan(arg);
|
ans = tan(arg);
|
||||||
"""
|
"""
|
||||||
}//end C wrapper
|
}//end C wrapper
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}//end tan function
|
}//end tan function
|
||||||
|
|
||||||
@@ -76,11 +76,11 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
{
|
{
|
||||||
|double| ans = 0;
|
|double| ans = 0;
|
||||||
__if_comp__ __C__{
|
__if_comp__ __C__{
|
||||||
__simple_Passthrough__ """
|
simple_passthrough(arg = arg : ans = ans :) """
|
||||||
ans = cos(arg);
|
ans = cos(arg);
|
||||||
"""
|
"""
|
||||||
}//end C wrapper
|
}//end C wrapper
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}//end cos function
|
}//end cos function
|
||||||
|
|
||||||
@@ -88,11 +88,11 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
{
|
{
|
||||||
|double| ans = 0;
|
|double| ans = 0;
|
||||||
__if_comp__ __C__{
|
__if_comp__ __C__{
|
||||||
__simple_Passthrough__ """
|
simple_passthrough(arg = arg : ans = ans :) """
|
||||||
ans = sin(arg);
|
ans = sin(arg);
|
||||||
"""
|
"""
|
||||||
}//end C wrapper
|
}//end C wrapper
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}//end sin function
|
}//end sin function
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
__if_comp__ __C__ __simple_passthrough__ """
|
__if_comp__ __C__ simple_passthrough """
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@ __if_comp__ __C__ __simple_passthrough__ """
|
|||||||
template <T> |T*| malloc(|int| size) {
|
template <T> |T*| malloc(|int| size) {
|
||||||
|T*| memPtr = 0;
|
|T*| memPtr = 0;
|
||||||
__if_comp__ __C__ {
|
__if_comp__ __C__ {
|
||||||
__simple_passthrough__ """
|
simple_passthrough( size = size : memPtr = memPtr :) """
|
||||||
memPtr = malloc(size);
|
memPtr = malloc(size);
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@ template <T> |T*| malloc(|int| size) {
|
|||||||
|
|
||||||
template <T> |void| free(|T*| memPtr) {
|
template <T> |void| free(|T*| memPtr) {
|
||||||
__if_comp__ __C__ {
|
__if_comp__ __C__ {
|
||||||
__simple_passthrough__ """
|
simple_passthrough(memPtr = memPtr ::) """
|
||||||
free(memPtr);
|
free(memPtr);
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
@@ -26,7 +26,7 @@ template <T> |int| sizeof() {
|
|||||||
|int| result = 0;
|
|int| result = 0;
|
||||||
|T| testObj;
|
|T| testObj;
|
||||||
__if_comp__ __C__ {
|
__if_comp__ __C__ {
|
||||||
__simple_passthrough__ """
|
simple_passthrough(testObj = testObj : result = result:) """
|
||||||
result = sizeof(testObj);
|
result = sizeof(testObj);
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
@@ -55,10 +55,10 @@ template <T(Destructable)> |void| delete(|T*| toDelete, |int| itemCount) {
|
|||||||
|
|
||||||
/* We specilize on the trait Destructable to decide on whether or not the destructor should be called */
|
/* We specilize on the trait Destructable to decide on whether or not the destructor should be called */
|
||||||
template <T> |void| delete(|T*| toDelete) {
|
template <T> |void| delete(|T*| toDelete) {
|
||||||
free(toDelete);
|
free<T>(toDelete);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <T(Destructable)> |void| delete(|T*| toDelete) {
|
template <T(Destructable)> |void| delete(|T*| toDelete) {
|
||||||
toDelete->destruct();
|
toDelete->destruct();
|
||||||
free(toDelete);
|
free<T>(toDelete);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user