declaration.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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_DECLARATION_H_
  5. #define EXECUTABLE_SEMANTICS_AST_DECLARATION_H_
  6. #include <list>
  7. #include <string>
  8. #include "executable_semantics/ast/function_definition.h"
  9. #include "executable_semantics/ast/member.h"
  10. #include "executable_semantics/ast/struct_definition.h"
  11. #include "executable_semantics/interpreter/address.h"
  12. #include "executable_semantics/interpreter/dictionary.h"
  13. namespace Carbon {
  14. struct Value;
  15. using TypeEnv = Dictionary<std::string, const Value*>;
  16. using Env = Dictionary<std::string, Address>;
  17. struct TypeCheckContext {
  18. // Symbol table mapping names of runtime entities to their type.
  19. TypeEnv types;
  20. // Symbol table mapping names of compile time entities to their value.
  21. Env values;
  22. };
  23. enum class DeclarationKind {
  24. FunctionDeclaration,
  25. StructDeclaration,
  26. ChoiceDeclaration,
  27. VariableDeclaration,
  28. };
  29. struct FunctionDeclaration {
  30. static constexpr DeclarationKind Kind = DeclarationKind::FunctionDeclaration;
  31. FunctionDefinition definition;
  32. };
  33. struct StructDeclaration {
  34. static constexpr DeclarationKind Kind = DeclarationKind::StructDeclaration;
  35. StructDefinition definition;
  36. };
  37. struct ChoiceDeclaration {
  38. static constexpr DeclarationKind Kind = DeclarationKind::ChoiceDeclaration;
  39. int line_num;
  40. std::string name;
  41. std::list<std::pair<std::string, const Expression*>> alternatives;
  42. };
  43. // Global variable definition implements the Declaration concept.
  44. struct VariableDeclaration {
  45. static constexpr DeclarationKind Kind = DeclarationKind::VariableDeclaration;
  46. int source_location;
  47. std::string name;
  48. const Expression* type;
  49. const Expression* initializer;
  50. };
  51. class Declaration {
  52. public:
  53. static auto MakeFunctionDeclaration(FunctionDefinition definition)
  54. -> const Declaration;
  55. static auto MakeStructDeclaration(int line_num, std::string name,
  56. std::list<Member*> members)
  57. -> const Declaration;
  58. static auto MakeChoiceDeclaration(
  59. int line_num, std::string name,
  60. std::list<std::pair<std::string, const Expression*>> alternatives)
  61. -> const Declaration;
  62. static auto MakeVariableDeclaration(int source_location, std::string name,
  63. const Expression* type,
  64. const Expression* initializer)
  65. -> const Declaration;
  66. auto GetFunctionDeclaration() const -> const FunctionDeclaration&;
  67. auto GetStructDeclaration() const -> const StructDeclaration&;
  68. auto GetChoiceDeclaration() const -> const ChoiceDeclaration&;
  69. auto GetVariableDeclaration() const -> const VariableDeclaration&;
  70. void Print() const;
  71. inline auto tag() const -> DeclarationKind {
  72. return std::visit([](const auto& t) { return t.Kind; }, value);
  73. }
  74. private:
  75. std::variant<FunctionDeclaration, StructDeclaration, ChoiceDeclaration,
  76. VariableDeclaration>
  77. value;
  78. };
  79. } // namespace Carbon
  80. #endif // EXECUTABLE_SEMANTICS_AST_DECLARATION_H_