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:
@@ -323,7 +323,17 @@ std::string CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
case statement:
|
case statement:
|
||||||
return tabs() + generate(children[0], enclosingObject) + ";\n";
|
return tabs() + generate(children[0], enclosingObject) + ";\n";
|
||||||
case if_statement:
|
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)
|
if (children.size() > 2)
|
||||||
output += " else " + generate(children[2], enclosingObject);
|
output += " else " + generate(children[2], enclosingObject);
|
||||||
return output;
|
return output;
|
||||||
|
|||||||
2
tests/test_else.expected_results
Normal file
2
tests/test_else.expected_results
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Right
|
||||||
|
Right
|
||||||
16
tests/test_else.krak
Normal file
16
tests/test_else.krak
Normal 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");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user