/src/org/ooc/backend/cdirty/ControlStatementWriter.java

http://github.com/nddrylliog/ooc · Java · 84 lines · 75 code · 9 blank · 0 comment · 7 complexity · b39eb15106be52f06e26974304f71950 MD5 · raw file

  1. package org.ooc.backend.cdirty;
  2. import java.io.IOException;
  3. import org.ooc.frontend.model.Else;
  4. import org.ooc.frontend.model.For;
  5. import org.ooc.frontend.model.Foreach;
  6. import org.ooc.frontend.model.If;
  7. import org.ooc.frontend.model.Line;
  8. import org.ooc.frontend.model.NodeList;
  9. import org.ooc.frontend.model.RangeLiteral;
  10. import org.ooc.frontend.model.VariableAccess;
  11. import org.ooc.frontend.model.While;
  12. import org.ooc.middle.OocCompilationError;
  13. public class ControlStatementWriter {
  14. public static void writeIf(If if1, CGenerator cgen) throws IOException {
  15. cgen.current.app("if (");
  16. if1.getCondition().accept(cgen);
  17. cgen.current.app(")");
  18. NodeList<Line> body = if1.getBody();
  19. cgen.current.openBlock();
  20. body.accept(cgen);
  21. cgen.current.closeBlock();
  22. }
  23. public static void writeElse(Else else1, CGenerator cgen) throws IOException {
  24. cgen.current.app("else ");
  25. NodeList<Line> body = else1.getBody();
  26. if(body.size() == 1 && (body.get(0).getStatement() instanceof If)) {
  27. body.get(0).getStatement().accept(cgen);
  28. } else {
  29. cgen.current.openBlock();
  30. body.accept(cgen);
  31. cgen.current.closeBlock();
  32. }
  33. }
  34. public static void writeWhile(While while1, CGenerator cgen) throws IOException {
  35. cgen.current.app("while (");
  36. while1.getCondition().accept(cgen);
  37. cgen.current.app(")").openBlock();
  38. while1.getBody().accept(cgen);
  39. cgen.current.closeBlock();
  40. }
  41. public static void writeForeach(Foreach foreach, CGenerator cgen) throws IOException {
  42. if(foreach.getCollection() instanceof RangeLiteral) {
  43. RangeLiteral range = (RangeLiteral) foreach.getCollection();
  44. cgen.current.app("for (");
  45. foreach.getVariable().accept(cgen);
  46. cgen.current.app(" = ");
  47. range.getLower().accept(cgen);
  48. cgen.current.app("; ");
  49. foreach.getVariable().accept(cgen);
  50. cgen.current.app(" < ");
  51. range.getUpper().accept(cgen);
  52. cgen.current.app("; ");
  53. foreach.getVariable().accept(cgen);
  54. cgen.current.app("++").app(")").openBlock();
  55. foreach.getBody().accept(cgen);
  56. cgen.current.closeBlock();
  57. } else {
  58. throw new OocCompilationError(foreach.getCollection(), cgen.module,
  59. "Iterating over... not a Range but a "+foreach.getCollection().getType());
  60. }
  61. }
  62. public static void writeFor(For for1, CGenerator cgen) throws IOException {
  63. cgen.current.app("for (");
  64. if(!(for1.getInit() instanceof VariableAccess)) {
  65. for1.getInit().accept(cgen);
  66. }
  67. cgen.current.app("; ");
  68. for1.getTest().accept(cgen);
  69. cgen.current.app("; ");
  70. for1.getIter().accept(cgen);
  71. cgen.current.app(")").openBlock();
  72. for1.getBody().accept(cgen);
  73. cgen.current.closeBlock();
  74. }
  75. }