expression.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. #ifndef EXECUTABLE_SEMANTICS_AST_EXPRESSION_H_
  5. #define EXECUTABLE_SEMANTICS_AST_EXPRESSION_H_
  6. #include <optional>
  7. #include <string>
  8. #include <variant>
  9. #include <vector>
  10. namespace Carbon {
  11. struct Expression;
  12. // A FieldInitializer represents the initialization of a single tuple field.
  13. struct FieldInitializer {
  14. // The field name. For a positional field, this may be empty.
  15. std::string name;
  16. // The expression that initializes the field.
  17. const Expression* expression;
  18. };
  19. enum class ExpressionKind {
  20. AutoTypeLiteral,
  21. BoolTypeLiteral,
  22. BoolLiteral,
  23. CallExpression,
  24. FunctionTypeLiteral,
  25. FieldAccessExpression,
  26. IndexExpression,
  27. IntTypeLiteral,
  28. ContinuationTypeLiteral, // The type of a continuation value.
  29. IntLiteral,
  30. BindingExpression,
  31. PrimitiveOperatorExpression,
  32. TupleLiteral,
  33. TypeTypeLiteral,
  34. IdentifierExpression,
  35. };
  36. enum class Operator {
  37. Add,
  38. And,
  39. Deref,
  40. Eq,
  41. Mul,
  42. Neg,
  43. Not,
  44. Or,
  45. Sub,
  46. Ptr,
  47. };
  48. struct Expression;
  49. struct IdentifierExpression {
  50. static constexpr ExpressionKind Kind = ExpressionKind::IdentifierExpression;
  51. std::string name;
  52. };
  53. struct FieldAccessExpression {
  54. static constexpr ExpressionKind Kind = ExpressionKind::FieldAccessExpression;
  55. const Expression* aggregate;
  56. std::string field;
  57. };
  58. struct IndexExpression {
  59. static constexpr ExpressionKind Kind = ExpressionKind::IndexExpression;
  60. const Expression* aggregate;
  61. const Expression* offset;
  62. };
  63. struct BindingExpression {
  64. static constexpr ExpressionKind Kind = ExpressionKind::BindingExpression;
  65. // nullopt represents the `_` placeholder.
  66. std::optional<std::string> name;
  67. const Expression* type;
  68. };
  69. struct IntLiteral {
  70. static constexpr ExpressionKind Kind = ExpressionKind::IntLiteral;
  71. int value;
  72. };
  73. struct BoolLiteral {
  74. static constexpr ExpressionKind Kind = ExpressionKind::BoolLiteral;
  75. bool value;
  76. };
  77. struct TupleLiteral {
  78. static constexpr ExpressionKind Kind = ExpressionKind::TupleLiteral;
  79. std::vector<FieldInitializer> fields;
  80. };
  81. struct PrimitiveOperatorExpression {
  82. static constexpr ExpressionKind Kind =
  83. ExpressionKind::PrimitiveOperatorExpression;
  84. Operator op;
  85. std::vector<const Expression*> arguments;
  86. };
  87. struct CallExpression {
  88. static constexpr ExpressionKind Kind = ExpressionKind::CallExpression;
  89. const Expression* function;
  90. const Expression* argument;
  91. };
  92. struct FunctionTypeLiteral {
  93. static constexpr ExpressionKind Kind = ExpressionKind::FunctionTypeLiteral;
  94. const Expression* parameter;
  95. const Expression* return_type;
  96. };
  97. struct AutoTypeLiteral {
  98. static constexpr ExpressionKind Kind = ExpressionKind::AutoTypeLiteral;
  99. };
  100. struct BoolTypeLiteral {
  101. static constexpr ExpressionKind Kind = ExpressionKind::BoolTypeLiteral;
  102. };
  103. struct IntTypeLiteral {
  104. static constexpr ExpressionKind Kind = ExpressionKind::IntTypeLiteral;
  105. };
  106. struct ContinuationTypeLiteral {
  107. static constexpr ExpressionKind Kind =
  108. ExpressionKind::ContinuationTypeLiteral;
  109. };
  110. struct TypeTypeLiteral {
  111. static constexpr ExpressionKind Kind = ExpressionKind::TypeTypeLiteral;
  112. };
  113. struct Expression {
  114. static auto MakeIdentifierExpression(int line_num, std::string var)
  115. -> const Expression*;
  116. static auto MakeBindingExpression(int line_num,
  117. std::optional<std::string> var,
  118. const Expression* type)
  119. -> const Expression*;
  120. static auto MakeIntLiteral(int line_num, int i) -> const Expression*;
  121. static auto MakeBoolLiteral(int line_num, bool b) -> const Expression*;
  122. static auto MakePrimitiveOperatorExpression(
  123. int line_num, Operator op, std::vector<const Expression*> args)
  124. -> const Expression*;
  125. static auto MakeCallExpression(int line_num, const Expression* fun,
  126. const Expression* arg) -> const Expression*;
  127. static auto MakeFieldAccessExpression(int line_num, const Expression* exp,
  128. std::string field) -> const Expression*;
  129. static auto MakeTupleLiteral(int line_num, std::vector<FieldInitializer> args)
  130. -> const Expression*;
  131. static auto MakeIndexExpression(int line_num, const Expression* exp,
  132. const Expression* i) -> const Expression*;
  133. static auto MakeTypeTypeLiteral(int line_num) -> const Expression*;
  134. static auto MakeIntTypeLiteral(int line_num) -> const Expression*;
  135. static auto MakeBoolTypeLiteral(int line_num) -> const Expression*;
  136. static auto MakeFunctionTypeLiteral(int line_num, const Expression* param,
  137. const Expression* ret)
  138. -> const Expression*;
  139. static auto MakeAutoTypeLiteral(int line_num) -> const Expression*;
  140. static auto MakeContinuationTypeLiteral(int line_num) -> const Expression*;
  141. auto GetIdentifierExpression() const -> const IdentifierExpression&;
  142. auto GetFieldAccessExpression() const -> const FieldAccessExpression&;
  143. auto GetIndexExpression() const -> const IndexExpression&;
  144. auto GetBindingExpression() const -> const BindingExpression&;
  145. auto GetIntLiteral() const -> int;
  146. auto GetBoolLiteral() const -> bool;
  147. auto GetTupleLiteral() const -> const TupleLiteral&;
  148. auto GetPrimitiveOperatorExpression() const
  149. -> const PrimitiveOperatorExpression&;
  150. auto GetCallExpression() const -> const CallExpression&;
  151. auto GetFunctionTypeLiteral() const -> const FunctionTypeLiteral&;
  152. inline auto tag() const -> ExpressionKind {
  153. return std::visit([](const auto& t) { return t.Kind; }, value);
  154. }
  155. int line_num;
  156. private:
  157. std::variant<IdentifierExpression, FieldAccessExpression, IndexExpression,
  158. BindingExpression, IntLiteral, BoolLiteral, TupleLiteral,
  159. PrimitiveOperatorExpression, CallExpression, FunctionTypeLiteral,
  160. AutoTypeLiteral, BoolTypeLiteral, IntTypeLiteral,
  161. ContinuationTypeLiteral, TypeTypeLiteral>
  162. value;
  163. };
  164. void PrintExp(const Expression* exp);
  165. } // namespace Carbon
  166. #endif // EXECUTABLE_SEMANTICS_AST_EXPRESSION_H_