Cthulhu  0.2.10
Cthulhu compiler collection
sema.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-3.0-only
2 
3 #include "oberon/sema/sema.h"
4 
7 
8 #include "cthulhu/util/util.h"
9 
10 #include "base/panic.h"
11 #include "core/macros.h"
12 
13 #include "scan/node.h"
14 
15 tree_t *obr_get_type(tree_t *sema, const char *name)
16 {
17  const size_t tags[] = { eObrTagTypes };
18  search_t search = { tags, sizeof(tags) / sizeof(size_t) };
19  return util_select_decl(sema, search, name);
20 }
21 
22 tree_t *obr_get_module(tree_t *sema, const char *name)
23 {
24  const size_t tags[] = { eObrTagModules };
25  search_t search = { tags, sizeof(tags) / sizeof(size_t) };
26  return util_select_decl(sema, search, name);
27 }
28 
29 tree_t *obr_get_symbol(tree_t *sema, obr_tag_t tag, const char *name)
30 {
31  const size_t tags[] = { tag };
32  search_t search = { tags, sizeof(tags) / sizeof(size_t) };
33  return util_select_decl(sema, search, name);
34 }
35 
36 tree_t *obr_get_namespace(tree_t *sema, const char *name)
37 {
38  const size_t tags[] = { eObrTagModules, eObrTagImports };
39  search_t search = { tags, sizeof(tags) / sizeof(size_t) };
40  return util_select_decl(sema, search, name);
41 }
42 
43 void obr_add_decl(tree_t *sema, obr_tag_t tag, const char *name, tree_t *decl)
44 {
45  const tree_t *old = tree_module_get(sema, tag, name);
46  if (old != NULL)
47  {
48  evt_symbol_shadowed(sema->reports, name, tree_get_node(old), tree_get_node(decl));
49  }
50  else
51  {
52  tree_module_set(sema, tag, name, decl);
53  }
54 }
55 
59 
60 static tree_t *gTypeBoolean = NULL;
61 static tree_t *gTypeChar = NULL;
62 static tree_t *gTypeShort = NULL;
63 static tree_t *gTypeInteger = NULL;
64 static tree_t *gTypeLong = NULL;
65 static tree_t *gTypeReal = NULL;
66 static tree_t *gTypeLongReal = NULL;
67 static tree_t *gTypeVoid = NULL;
68 
70 {
71  CTASSERT(gTypeBoolean != NULL);
72  return gTypeBoolean;
73 }
74 
76 {
77  CTASSERT(gTypeChar != NULL);
78  return gTypeChar;
79 }
80 
82 {
83  CTASSERT(gTypeShort != NULL);
84  return gTypeShort;
85 }
86 
88 {
89  CTASSERT(gTypeInteger != NULL);
90  return gTypeInteger;
91 }
92 
93 tree_t *obr_get_string_type(const node_t *node, size_t length)
94 {
95  CTASSERT(gTypeChar != NULL);
96  return tree_type_array(node, "STRING", gTypeChar, length + 1);
97 }
98 
100 {
101  CTASSERT(gTypeLong != NULL);
102  return gTypeLong;
103 }
104 
106 {
107  CTASSERT(gTypeReal != NULL);
108  return gTypeReal;
109 }
110 
112 {
113  CTASSERT(gTypeLongReal != NULL);
114  return gTypeLongReal;
115 }
116 
118 {
119  CTASSERT(gTypeVoid != NULL);
120  return gTypeVoid;
121 }
122 
123 void obr_create(language_runtime_t *runtime, tree_t *root)
124 {
125  CT_UNUSED(runtime);
126 
127  const node_t *node = tree_get_node(root);
128  gTypeBoolean = tree_type_bool(node, "BOOLEAN");
129  gTypeChar = tree_type_digit(node, "CHAR", eDigitChar, eSignSigned);
130  gTypeShort = tree_type_digit(node, "SHORTINT", eDigitShort, eSignSigned);
131  gTypeInteger = tree_type_digit(node, "INTEGER", eDigitInt, eSignSigned);
132  gTypeLong = tree_type_digit(node, "LONGINT", eDigitLong, eSignSigned);
133  gTypeVoid = tree_type_unit(node, "VOID");
134 
135  obr_add_decl(root, eObrTagTypes, "BOOLEAN", gTypeBoolean);
136  obr_add_decl(root, eObrTagTypes, "CHAR", gTypeChar);
137  obr_add_decl(root, eObrTagTypes, "SHORTINT", gTypeShort);
138  obr_add_decl(root, eObrTagTypes, "INTEGER", gTypeInteger);
139  obr_add_decl(root, eObrTagTypes, "LONGINT", gTypeLong);
140  obr_add_decl(root, eObrTagTypes, "VOID", gTypeVoid);
141 }
CT_PUREFN CT_TREE_API const node_t * tree_get_node(const tree_t *tree)
Definition: context.c:94
CT_EVENTS_API event_builder_t evt_symbol_shadowed(logger_t *logger, const char *name, const node_t *prev, const node_t *next)
signal that a declaration would shadow a previous declaration
Definition: events.c:47
#define CT_UNUSED(x)
mark a variable as unused
Definition: macros.h:46
#define CTASSERT(expr)
assert a condition, prints the condition as a message
Definition: panic.h:130
CT_UTIL_API void * util_select_decl(tree_t *sema, search_t search, const char *name)
search for a declaration by name in a set of tags
Definition: util.c:16
CT_TREE_API tree_t * tree_type_bool(const node_t *node, const char *name)
create a bool type, this is a type that has only two values, true and false
Definition: tree.c:128
CT_TREE_API tree_t * tree_type_digit(const node_t *node, const char *name, digit_t digit, sign_t sign)
create a digit type
Definition: tree.c:138
CT_TREE_API tree_t * tree_type_unit(const node_t *node, const char *name)
create a unit type, this is a type that has only one value. equivilent to void
Definition: tree.c:123
void * tree_module_set(tree_t *self, size_t tag, const char *name, void *value)
set a declaration in the current module
Definition: sema.c:111
CT_TREE_API tree_t * tree_type_array(const node_t *node, const char *name, const tree_t *array, size_t length)
create a new array type
Definition: tree.c:175
void * tree_module_get(tree_t *self, size_t tag, const char *name)
recursively search for a declaration in a module
Definition: sema.c:59
tree_t * obr_get_symbol(tree_t *sema, obr_tag_t tag, const char *name)
getters
Definition: sema.c:29
tree_t * obr_get_char_type(void)
Definition: sema.c:75
tree_t * obr_get_integer_type(void)
Definition: sema.c:87
void obr_add_decl(tree_t *sema, obr_tag_t tag, const char *name, tree_t *decl)
add decls
Definition: sema.c:43
tree_t * obr_get_module(tree_t *sema, const char *name)
Definition: sema.c:22
void obr_create(language_runtime_t *runtime, tree_t *root)
runtime module
Definition: sema.c:123
tree_t * obr_get_string_type(const node_t *node, size_t length)
Definition: sema.c:93
tree_t * obr_get_void_type(void)
Definition: sema.c:117
tree_t * obr_get_type(tree_t *sema, const char *name)
Definition: sema.c:15
tree_t * obr_get_bool_type(void)
builtin types
Definition: sema.c:69
tree_t * obr_get_longint_type(void)
Definition: sema.c:99
tree_t * obr_get_namespace(tree_t *sema, const char *name)
Definition: sema.c:36
tree_t * obr_get_real_type(void)
Definition: sema.c:105
tree_t * obr_get_shortint_type(void)
Definition: sema.c:81
tree_t * obr_get_longreal_type(void)
Definition: sema.c:111
obr_tag_t
Definition: sema.h:9
a position in a source file
Definition: node.h:23
Definition: util.h:28
Definition: tree.h:67
logger_t * reports
Definition: tree.h:227