More AST stuff. Now supports boolean stuff
This commit is contained in:
@@ -28,29 +28,30 @@ typed_parameter = type WS parameter ;
|
|||||||
|
|
||||||
opt_parameter_list = parameter_list | ;
|
opt_parameter_list = parameter_list | ;
|
||||||
parameter_list = parameter_list WS parameter | parameter ;
|
parameter_list = parameter_list WS parameter | parameter ;
|
||||||
parameter = expression ;
|
parameter = boolean_expression ;
|
||||||
|
|
||||||
code_block = "{" WS statement_list WS "}" ;
|
code_block = "{" WS statement_list WS "}" ;
|
||||||
statement_list = statement_list WS statement | statement ;
|
statement_list = statement_list WS statement | statement ;
|
||||||
statement = if_statement | return_statement | expression WS ";" | boolean_expression WS ";" | assignment_statement WS ";" | declaration_statement WS ";" | code_block ;
|
statement = if_statement | return_statement | boolean_expression WS ";" | boolean_expression WS ";" | assignment_statement WS ";" | declaration_statement WS ";" | code_block ;
|
||||||
function_call = scope identifier "\(" WS opt_parameter_list WS "\)" ;
|
function_call = scope identifier "\(" WS opt_parameter_list WS "\)" ;
|
||||||
scope = scope identifier "::" | ;
|
scope = scope identifier "::" | ;
|
||||||
|
|
||||||
if_statement = "if" WS boolean_expression WS statement | "if" WS "\(" WS boolean_expression WS "\)" WS statement ;
|
if_statement = "if" WS boolean_expression WS statement ;
|
||||||
|
|
||||||
|
return_statement = "return" WS boolean_expression WS ";" ;
|
||||||
|
|
||||||
boolean_expression = boolean_expression WS "\|\|" WS and_boolean_expression | and_boolean_expression ;
|
boolean_expression = boolean_expression WS "\|\|" WS and_boolean_expression | and_boolean_expression ;
|
||||||
and_boolean_expression = and_boolean_expression "&&" bool_exp | bool_exp ;
|
and_boolean_expression = and_boolean_expression "&&" bool_exp | bool_exp ;
|
||||||
bool_exp = "!" WS bool_exp | expression WS "==" WS expression | bool ;
|
bool_exp = "!" WS bool_exp | expression WS comparator WS expression | bool | expression ;
|
||||||
|
comparator = "==" | "<=" | ">=" | "!=" ;
|
||||||
return_statement = "return" WS "\(" WS expression WS "\)" WS ";" | "return" WS expression WS ";" ;
|
|
||||||
|
|
||||||
expression = expression WS "-" WS term | expression WS "\+" WS term | term ;
|
expression = expression WS "-" WS term | expression WS "\+" WS term | term ;
|
||||||
term = term WS forward_slash WS factor | term WS "\*" WS factor | factor ;
|
term = term WS forward_slash WS factor | term WS "\*" WS factor | factor ;
|
||||||
factor = number | identifier | function_call | bool | string ;
|
factor = number | identifier | function_call | bool | string | "\(" WS boolean_expression WS "\)" ;
|
||||||
number = integer | float | double ;
|
number = integer | float | double ;
|
||||||
|
|
||||||
assignment_statement = identifier WS "=" WS expression ;
|
assignment_statement = identifier WS "=" WS boolean_expression ;
|
||||||
declaration_statement = type WS identifier WS "=" WS expression ;
|
declaration_statement = type WS identifier WS "=" WS boolean_expression ;
|
||||||
|
|
||||||
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)+" ;
|
||||||
@@ -61,4 +62,4 @@ double = sign numeric "." numeric | sign numeric "." numeric "d" ;
|
|||||||
bool = "true" | "false" | "True" | "False" ;
|
bool = "true" | "false" | "True" | "False" ;
|
||||||
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|.|_)+" ;
|
||||||
numeric = "(0|1|2|3|4|5|6|7|8|9)+" ;
|
numeric = "(0|1|2|3|4|5|6|7|8|9)+" ;
|
||||||
string = "\"(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|.|!|_|-| | |\\|/|\||0|1|2|3|4|5|6|7|8|9)+\"" ;
|
string = "\"(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|.|!|\?|_|-| | |\\|/|\||0|1|2|3|4|5|6|7|8|9)+\"" ;
|
||||||
2
main.cpp
2
main.cpp
@@ -121,6 +121,8 @@ int main(int argc, char* argv[]) {
|
|||||||
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol(";", true)));
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol(";", true)));
|
||||||
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("{", true)));
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("{", true)));
|
||||||
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("}", true)));
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("}", true)));
|
||||||
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("(", true)));
|
||||||
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol(")", true)));
|
||||||
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("import", true))); //Don't need the actual text of the symbol
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("import", true))); //Don't need the actual text of the symbol
|
||||||
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("interpreter_directive", false)));
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("interpreter_directive", false)));
|
||||||
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("if", true)));
|
preASTTransforms.push_back(new RemovalTransformation<Symbol>(Symbol("if", true)));
|
||||||
|
|||||||
@@ -34,6 +34,33 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from) {
|
|||||||
newNode = transform(children[1]); //Transform to get the identifier
|
newNode = transform(children[1]); //Transform to get the identifier
|
||||||
newNode->getDataRef()->valueType = ASTData::strToType(concatSymbolTree(children[0])); //Get the type (left child) and set our new identifer to be that type
|
newNode->getDataRef()->valueType = ASTData::strToType(concatSymbolTree(children[0])); //Get the type (left child) and set our new identifer to be that type
|
||||||
return newNode;
|
return newNode;
|
||||||
|
} else if (name == "boolean_expression") {
|
||||||
|
//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<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 == "and_boolean_expression") {
|
||||||
|
//If this is an actual part of an expression, not just a premoted bool_exp
|
||||||
|
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 bool_exp, so do child
|
||||||
|
}
|
||||||
|
} else if (name == "bool_exp") {
|
||||||
|
//If this is an actual part of an expression, not just a premoted bool_exp.
|
||||||
|
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 bool_exp, so do child
|
||||||
|
}
|
||||||
} else if (name == "expression") {
|
} else if (name == "expression") {
|
||||||
//If this is an actual part of an expression, not just a premoted term
|
//If this is an actual part of an expression, not just a premoted term
|
||||||
if (children.size() > 1) {
|
if (children.size() > 1) {
|
||||||
@@ -54,8 +81,6 @@ NodeTree<ASTData>* ASTTransformation::transform(NodeTree<Symbol>* from) {
|
|||||||
}
|
}
|
||||||
} else if (name == "factor") {
|
} else if (name == "factor") {
|
||||||
return transform(children[0]); //Just a premoted number or function call or something, so use it instead
|
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<ASTData>(name, ASTData(boolean_expression));
|
|
||||||
} else if (name == "statement") {
|
} else if (name == "statement") {
|
||||||
newNode = new NodeTree<ASTData>(name, ASTData(statement));
|
newNode = new NodeTree<ASTData>(name, ASTData(statement));
|
||||||
} else if (name == "if_statement") {
|
} else if (name == "if_statement") {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
|||||||
//Do nothing
|
//Do nothing
|
||||||
break;
|
break;
|
||||||
case import:
|
case import:
|
||||||
return "#include \"" + data.symbol.getName() + "\"\n";
|
return "#include <" + data.symbol.getName() + ">\n";
|
||||||
break;
|
break;
|
||||||
case identifier:
|
case identifier:
|
||||||
return data.symbol.getName();
|
return data.symbol.getName();
|
||||||
@@ -42,7 +42,7 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
|||||||
return output;
|
return output;
|
||||||
break;
|
break;
|
||||||
case code_block:
|
case code_block:
|
||||||
output += tabs() + "{\n";
|
output += "{\n";
|
||||||
tabLevel++;
|
tabLevel++;
|
||||||
for (int i = 0; i < children.size(); i++)
|
for (int i = 0; i < children.size(); i++)
|
||||||
output += generate(children[i]);
|
output += generate(children[i]);
|
||||||
@@ -60,7 +60,7 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
|||||||
return tabs() + generate(children[0]) + ";\n";
|
return tabs() + generate(children[0]) + ";\n";
|
||||||
break;
|
break;
|
||||||
case if_statement:
|
case if_statement:
|
||||||
output += "if (" + generate(children[0]) + ") \n" + generate(children[1]);
|
output += "if (" + generate(children[0]) + ")\n\t" + generate(children[1]);
|
||||||
if (children.size() > 2)
|
if (children.size() > 2)
|
||||||
output += " else " + generate(children[2]);
|
output += " else " + generate(children[2]);
|
||||||
return output;
|
return output;
|
||||||
@@ -76,7 +76,7 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
|||||||
//Handle operators specially for now. Will later replace with
|
//Handle operators specially for now. Will later replace with
|
||||||
//Inlined functions in the standard library
|
//Inlined functions in the standard library
|
||||||
std::string name = data.symbol.getName();
|
std::string name = data.symbol.getName();
|
||||||
if (name == "+" || name == "-" || name == "*" || name == "/") {
|
if (name == "+" || name == "-" || name == "*" || name == "/" || name == "==" || name == ">=" || name == "<=" || name == "!=") {
|
||||||
return "((" + generate(children[0]) + ")" + name + "(" + generate(children[1]) + "))";
|
return "((" + generate(children[0]) + ")" + name + "(" + generate(children[1]) + "))";
|
||||||
}
|
}
|
||||||
output += data.symbol.getName() + "(";
|
output += data.symbol.getName() + "(";
|
||||||
|
|||||||
Reference in New Issue
Block a user