expression.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 <string>
  7. #include <vector>
  8. namespace Carbon {
  9. enum class ExpressionKind {
  10. AutoT,
  11. BoolT,
  12. Boolean,
  13. Call,
  14. FunctionT,
  15. GetField,
  16. Index,
  17. IntT,
  18. Integer,
  19. PatternVariable,
  20. PrimitiveOp,
  21. Tuple,
  22. TypeT,
  23. Variable,
  24. };
  25. enum class Operator {
  26. Add,
  27. And,
  28. Eq,
  29. Neg,
  30. Not,
  31. Or,
  32. Sub,
  33. };
  34. struct Expression {
  35. int line_num;
  36. ExpressionKind tag;
  37. union {
  38. struct {
  39. std::string* name;
  40. } variable;
  41. struct {
  42. Expression* aggregate;
  43. std::string* field;
  44. } get_field;
  45. struct {
  46. Expression* aggregate;
  47. Expression* offset;
  48. } index;
  49. struct {
  50. std::string* name;
  51. Expression* type;
  52. } pattern_variable;
  53. int integer;
  54. bool boolean;
  55. struct {
  56. std::vector<std::pair<std::string, Expression*>>* fields;
  57. } tuple;
  58. struct {
  59. Operator op;
  60. std::vector<Expression*>* arguments;
  61. } primitive_op;
  62. struct {
  63. Expression* function;
  64. Expression* argument;
  65. } call;
  66. struct {
  67. Expression* parameter;
  68. Expression* return_type;
  69. } function_type;
  70. } u;
  71. };
  72. auto MakeVar(int line_num, std::string var) -> Expression*;
  73. auto MakeVarPat(int line_num, std::string var, Expression* type) -> Expression*;
  74. auto MakeInt(int line_num, int i) -> Expression*;
  75. auto MakeBool(int line_num, bool b) -> Expression*;
  76. auto MakeOp(int line_num, Operator op, std::vector<Expression*>* args)
  77. -> Expression*;
  78. auto MakeUnOp(int line_num, enum Operator op, Expression* arg) -> Expression*;
  79. auto MakeBinOp(int line_num, enum Operator op, Expression* arg1,
  80. Expression* arg2) -> Expression*;
  81. auto MakeCall(int line_num, Expression* fun, Expression* arg) -> Expression*;
  82. auto MakeGetField(int line_num, Expression* exp, std::string field)
  83. -> Expression*;
  84. auto MakeTuple(int line_num,
  85. std::vector<std::pair<std::string, Expression*>>* args)
  86. -> Expression*;
  87. auto MakeIndex(int line_num, Expression* exp, Expression* i) -> Expression*;
  88. auto MakeTypeType(int line_num) -> Expression*;
  89. auto MakeIntType(int line_num) -> Expression*;
  90. auto MakeBoolType(int line_num) -> Expression*;
  91. auto MakeFunType(int line_num, Expression* param, Expression* ret)
  92. -> Expression*;
  93. auto MakeAutoType(int line_num) -> Expression*;
  94. void PrintExp(const Expression* exp);
  95. } // namespace Carbon
  96. #endif // EXECUTABLE_SEMANTICS_AST_EXPRESSION_H_