diff --git a/src/CGenerator.cpp b/src/CGenerator.cpp index 17eb9f1..edc8d6e 100644 --- a/src/CGenerator.cpp +++ b/src/CGenerator.cpp @@ -323,7 +323,17 @@ std::string CGenerator::generate(NodeTree* from, NodeTree* 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; diff --git a/tests/test_else.expected_results b/tests/test_else.expected_results new file mode 100644 index 0000000..87dfef2 --- /dev/null +++ b/tests/test_else.expected_results @@ -0,0 +1,2 @@ +Right +Right diff --git a/tests/test_else.krak b/tests/test_else.krak new file mode 100644 index 0000000..a9dd61e --- /dev/null +++ b/tests/test_else.krak @@ -0,0 +1,16 @@ +import io:*; + + +|int| main() { + if (1>2) { + println("Wrong"); + } else { + println("Right"); + } + if (3>4) + println("Wrong"); + else + println("Right"); +} + +