So Chris found that if/else statements using blocks didn't work because they generated C like if(a) {b}; else {c}; -- so that's fixed now, with test :)

This commit is contained in:
Nathan Braswell
2015-03-16 05:59:56 -04:00
parent 15c4a4bf0e
commit 78d16c5510
3 changed files with 29 additions and 1 deletions

View File

@@ -323,7 +323,17 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
case statement:
return tabs() + generate(children[0], enclosingObject) + ";\n";
case if_statement:
output += "if (" + generate(children[0], enclosingObject) + ")\n\t" + generate(children[1], enclosingObject);
output += "if (" + generate(children[0], enclosingObject) + ")\n\t";
// We have to see if the then statement is a regular single statement or a block.
// If it's a block, because it's also a statement a semicolon will be emitted even though
// we don't want it to be, as if (a) {b}; else {c}; is not legal C, but if (a) {b} else {c}; is.
if (children[1]->getChildren()[0]->getDataRef()->type == code_block) {
std::cout << "Then statement is a block, emitting the block not the statement so no trailing semicolon" << std::endl;
output += generate(children[1]->getChildren()[0], enclosingObject);
} else {
std::cout << "Then statement is a simple statement, regular emitting the statement so trailing semicolon" << std::endl;
output += generate(children[1], enclosingObject);
}
if (children.size() > 2)
output += " else " + generate(children[2], enclosingObject);
return output;

View File

@@ -0,0 +1,2 @@
Right
Right

16
tests/test_else.krak Normal file
View File

@@ -0,0 +1,16 @@
import io:*;
|int| main() {
if (1>2) {
println("Wrong");
} else {
println("Right");
}
if (3>4)
println("Wrong");
else
println("Right");
}