FINALLY fixed an error that took weeks. Turned out that the ParseRule was shallow copied, and the lookahead was not copied correctly. So it got extended and thus skipped over the state when it should have been redone.
This commit is contained in:
@@ -27,10 +27,8 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
||||
break;
|
||||
case import:
|
||||
return "#include <" + data.symbol.getName() + ">\n";
|
||||
break;
|
||||
case identifier:
|
||||
return data.symbol.getName();
|
||||
break;
|
||||
case function:
|
||||
output += "\n" + ValueTypeToCType(data.valueType) + " " + data.symbol.getName() + "(";
|
||||
for (int i = 0; i < children.size()-1; i++) {
|
||||
@@ -40,7 +38,6 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
||||
}
|
||||
output+= ")\n" + generate(children[children.size()-1]);
|
||||
return output;
|
||||
break;
|
||||
case code_block:
|
||||
output += "{\n";
|
||||
tabLevel++;
|
||||
@@ -49,22 +46,23 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
||||
tabLevel--;
|
||||
output += tabs() + "}";
|
||||
return output;
|
||||
break;
|
||||
case expression:
|
||||
output += " " + data.symbol.getName() + ", ";
|
||||
break;
|
||||
case boolean_expression:
|
||||
output += " " + data.symbol.getName() + " ";
|
||||
break;
|
||||
case statement:
|
||||
return tabs() + generate(children[0]) + ";\n";
|
||||
break;
|
||||
case if_statement:
|
||||
output += "if (" + generate(children[0]) + ")\n\t" + generate(children[1]);
|
||||
if (children.size() > 2)
|
||||
output += " else " + generate(children[2]);
|
||||
return output;
|
||||
break;
|
||||
case while_loop:
|
||||
output += "if (" + generate(children[0]) + ")\n\t" + generate(children[1]);
|
||||
return output;
|
||||
case for_loop:
|
||||
output += "if (" + generate(children[0]) + ")\n\t" + generate(children[1]);
|
||||
return output;
|
||||
case return_statement:
|
||||
return "return " + generate(children[0]);
|
||||
case assignment_statement:
|
||||
@@ -76,7 +74,7 @@ std::string CGenerator::generate(NodeTree<ASTData>* from) {
|
||||
//Handle operators specially for now. Will later replace with
|
||||
//Inlined functions in the standard library
|
||||
std::string name = data.symbol.getName();
|
||||
if (name == "+" || name == "-" || name == "*" || name == "/" || name == "==" || name == ">=" || name == "<=" || name == "!=") {
|
||||
if (name == "+" || name == "-" || name == "*" || name == "/" || name == "==" || name == ">=" || name == "<=" || name == "!=" || name == "%") {
|
||||
return "((" + generate(children[0]) + ")" + name + "(" + generate(children[1]) + "))";
|
||||
}
|
||||
output += data.symbol.getName() + "(";
|
||||
|
||||
Reference in New Issue
Block a user