statement.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "executable_semantics/ast/statement.h"
  5. #include <iostream>
  6. namespace Carbon {
  7. auto MakeExpStmt(int line_num, Expression* exp) -> Statement* {
  8. auto* s = new Statement();
  9. s->line_num = line_num;
  10. s->tag = StatementKind::ExpressionStatement;
  11. s->u.exp = exp;
  12. return s;
  13. }
  14. auto MakeAssign(int line_num, Expression* lhs, Expression* rhs) -> Statement* {
  15. auto* s = new Statement();
  16. s->line_num = line_num;
  17. s->tag = StatementKind::Assign;
  18. s->u.assign.lhs = lhs;
  19. s->u.assign.rhs = rhs;
  20. return s;
  21. }
  22. auto MakeVarDef(int line_num, Expression* pat, Expression* init) -> Statement* {
  23. auto* s = new Statement();
  24. s->line_num = line_num;
  25. s->tag = StatementKind::VariableDefinition;
  26. s->u.variable_definition.pat = pat;
  27. s->u.variable_definition.init = init;
  28. return s;
  29. }
  30. auto MakeIf(int line_num, Expression* cond, Statement* then_stmt,
  31. Statement* else_stmt) -> Statement* {
  32. auto* s = new Statement();
  33. s->line_num = line_num;
  34. s->tag = StatementKind::If;
  35. s->u.if_stmt.cond = cond;
  36. s->u.if_stmt.then_stmt = then_stmt;
  37. s->u.if_stmt.else_stmt = else_stmt;
  38. return s;
  39. }
  40. auto MakeWhile(int line_num, Expression* cond, Statement* body) -> Statement* {
  41. auto* s = new Statement();
  42. s->line_num = line_num;
  43. s->tag = StatementKind::While;
  44. s->u.while_stmt.cond = cond;
  45. s->u.while_stmt.body = body;
  46. return s;
  47. }
  48. auto MakeBreak(int line_num) -> Statement* {
  49. std::cout << "MakeBlock" << std::endl;
  50. auto* s = new Statement();
  51. s->line_num = line_num;
  52. s->tag = StatementKind::Break;
  53. return s;
  54. }
  55. auto MakeContinue(int line_num) -> Statement* {
  56. auto* s = new Statement();
  57. s->line_num = line_num;
  58. s->tag = StatementKind::Continue;
  59. return s;
  60. }
  61. auto MakeReturn(int line_num, Expression* e) -> Statement* {
  62. auto* s = new Statement();
  63. s->line_num = line_num;
  64. s->tag = StatementKind::Return;
  65. s->u.return_stmt = e;
  66. return s;
  67. }
  68. auto MakeSeq(int line_num, Statement* s1, Statement* s2) -> Statement* {
  69. auto* s = new Statement();
  70. s->line_num = line_num;
  71. s->tag = StatementKind::Sequence;
  72. s->u.sequence.stmt = s1;
  73. s->u.sequence.next = s2;
  74. return s;
  75. }
  76. auto MakeBlock(int line_num, Statement* stmt) -> Statement* {
  77. auto* s = new Statement();
  78. s->line_num = line_num;
  79. s->tag = StatementKind::Block;
  80. s->u.block.stmt = stmt;
  81. return s;
  82. }
  83. auto MakeMatch(int line_num, Expression* exp,
  84. std::list<std::pair<Expression*, Statement*>>* clauses)
  85. -> Statement* {
  86. auto* s = new Statement();
  87. s->line_num = line_num;
  88. s->tag = StatementKind::Match;
  89. s->u.match_stmt.exp = exp;
  90. s->u.match_stmt.clauses = clauses;
  91. return s;
  92. }
  93. void PrintStatement(Statement* s, int depth) {
  94. if (!s) {
  95. return;
  96. }
  97. if (depth == 0) {
  98. std::cout << " ... ";
  99. return;
  100. }
  101. switch (s->tag) {
  102. case StatementKind::Match:
  103. std::cout << "match (";
  104. PrintExp(s->u.match_stmt.exp);
  105. std::cout << ") {";
  106. if (depth < 0 || depth > 1) {
  107. std::cout << std::endl;
  108. for (auto& clause : *s->u.match_stmt.clauses) {
  109. std::cout << "case ";
  110. PrintExp(clause.first);
  111. std::cout << " =>" << std::endl;
  112. PrintStatement(clause.second, depth - 1);
  113. std::cout << std::endl;
  114. }
  115. } else {
  116. std::cout << "...";
  117. }
  118. std::cout << "}";
  119. break;
  120. case StatementKind::While:
  121. std::cout << "while (";
  122. PrintExp(s->u.while_stmt.cond);
  123. std::cout << ")" << std::endl;
  124. PrintStatement(s->u.while_stmt.body, depth - 1);
  125. break;
  126. case StatementKind::Break:
  127. std::cout << "break;";
  128. break;
  129. case StatementKind::Continue:
  130. std::cout << "continue;";
  131. break;
  132. case StatementKind::VariableDefinition:
  133. std::cout << "var ";
  134. PrintExp(s->u.variable_definition.pat);
  135. std::cout << " = ";
  136. PrintExp(s->u.variable_definition.init);
  137. std::cout << ";";
  138. break;
  139. case StatementKind::ExpressionStatement:
  140. PrintExp(s->u.exp);
  141. std::cout << ";";
  142. break;
  143. case StatementKind::Assign:
  144. PrintExp(s->u.assign.lhs);
  145. std::cout << " = ";
  146. PrintExp(s->u.assign.rhs);
  147. std::cout << ";";
  148. break;
  149. case StatementKind::If:
  150. std::cout << "if (";
  151. PrintExp(s->u.if_stmt.cond);
  152. std::cout << ")" << std::endl;
  153. PrintStatement(s->u.if_stmt.then_stmt, depth - 1);
  154. std::cout << std::endl << "else" << std::endl;
  155. PrintStatement(s->u.if_stmt.else_stmt, depth - 1);
  156. break;
  157. case StatementKind::Return:
  158. std::cout << "return ";
  159. PrintExp(s->u.return_stmt);
  160. std::cout << ";";
  161. break;
  162. case StatementKind::Sequence:
  163. PrintStatement(s->u.sequence.stmt, depth);
  164. if (depth < 0 || depth > 1) {
  165. std::cout << std::endl;
  166. }
  167. PrintStatement(s->u.sequence.next, depth - 1);
  168. break;
  169. case StatementKind::Block:
  170. std::cout << "{" << std::endl;
  171. PrintStatement(s->u.block.stmt, depth - 1);
  172. std::cout << std::endl << "}" << std::endl;
  173. }
  174. }
  175. } // namespace Carbon