herb 0.7.2-aarch64-linux-gnu → 0.7.4-aarch64-linux-gnu
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +2 -0
- data/README.md +1 -1
- data/Rakefile +46 -1
- data/config.yml +714 -0
- data/ext/herb/extconf.rb +2 -1
- data/ext/herb/nodes.c +1 -1
- data/herb.gemspec +3 -0
- data/lib/herb/3.0/herb.so +0 -0
- data/lib/herb/3.1/herb.so +0 -0
- data/lib/herb/3.2/herb.so +0 -0
- data/lib/herb/3.3/herb.so +0 -0
- data/lib/herb/3.4/herb.so +0 -0
- data/lib/herb/engine.rb +8 -1
- data/lib/herb/version.rb +1 -1
- data/src/analyze.c +5 -9
- data/src/analyze_helpers.c +17 -6
- data/src/herb.c +2 -2
- data/src/include/parser.h +2 -2
- data/src/include/pretty_print.h +1 -1
- data/src/include/version.h +1 -1
- data/src/parser.c +3 -2
- data/src/pretty_print.c +1 -1
- data/templates/ext/herb/error_helpers.c.erb +85 -0
- data/templates/ext/herb/error_helpers.h.erb +12 -0
- data/templates/ext/herb/nodes.c.erb +90 -0
- data/templates/ext/herb/nodes.h.erb +9 -0
- data/templates/javascript/packages/core/src/errors.ts.erb +193 -0
- data/templates/javascript/packages/core/src/node-type-guards.ts.erb +325 -0
- data/templates/javascript/packages/core/src/nodes.ts.erb +414 -0
- data/templates/javascript/packages/core/src/visitor.ts.erb +29 -0
- data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +113 -0
- data/templates/javascript/packages/node/extension/error_helpers.h.erb +17 -0
- data/templates/javascript/packages/node/extension/nodes.cpp.erb +111 -0
- data/templates/javascript/packages/node/extension/nodes.h.erb +17 -0
- data/templates/lib/herb/ast/nodes.rb.erb +117 -0
- data/templates/lib/herb/errors.rb.erb +106 -0
- data/templates/lib/herb/visitor.rb.erb +28 -0
- data/templates/sig/serialized_ast_errors.rbs.erb +10 -0
- data/templates/sig/serialized_ast_nodes.rbs.erb +10 -0
- data/templates/src/ast_nodes.c.erb +145 -0
- data/templates/src/ast_pretty_print.c.erb +97 -0
- data/templates/src/errors.c.erb +245 -0
- data/templates/src/include/ast_nodes.h.erb +46 -0
- data/templates/src/include/ast_pretty_print.h.erb +14 -0
- data/templates/src/include/errors.h.erb +58 -0
- data/templates/src/visitor.c.erb +47 -0
- data/templates/template.rb +406 -0
- data/templates/wasm/error_helpers.cpp.erb +93 -0
- data/templates/wasm/error_helpers.h.erb +15 -0
- data/templates/wasm/nodes.cpp.erb +79 -0
- data/templates/wasm/nodes.h.erb +15 -0
- data/vendor/prism/Rakefile +75 -0
- data/vendor/prism/config.yml +4713 -0
- data/vendor/prism/include/prism/ast.h +8190 -0
- data/vendor/prism/include/prism/defines.h +260 -0
- data/vendor/prism/include/prism/diagnostic.h +455 -0
- data/vendor/prism/include/prism/encoding.h +283 -0
- data/vendor/prism/include/prism/node.h +129 -0
- data/vendor/prism/include/prism/options.h +482 -0
- data/vendor/prism/include/prism/pack.h +163 -0
- data/vendor/prism/include/prism/parser.h +933 -0
- data/vendor/prism/include/prism/prettyprint.h +34 -0
- data/vendor/prism/include/prism/regexp.h +43 -0
- data/vendor/prism/include/prism/static_literals.h +121 -0
- data/vendor/prism/include/prism/util/pm_buffer.h +236 -0
- data/vendor/prism/include/prism/util/pm_char.h +204 -0
- data/vendor/prism/include/prism/util/pm_constant_pool.h +218 -0
- data/vendor/prism/include/prism/util/pm_integer.h +130 -0
- data/vendor/prism/include/prism/util/pm_list.h +103 -0
- data/vendor/prism/include/prism/util/pm_memchr.h +29 -0
- data/vendor/prism/include/prism/util/pm_newline_list.h +113 -0
- data/vendor/prism/include/prism/util/pm_string.h +200 -0
- data/vendor/prism/include/prism/util/pm_strncasecmp.h +32 -0
- data/vendor/prism/include/prism/util/pm_strpbrk.h +46 -0
- data/vendor/prism/include/prism/version.h +29 -0
- data/vendor/prism/include/prism.h +408 -0
- data/vendor/prism/src/diagnostic.c +848 -0
- data/vendor/prism/src/encoding.c +5235 -0
- data/vendor/prism/src/node.c +8676 -0
- data/vendor/prism/src/options.c +328 -0
- data/vendor/prism/src/pack.c +509 -0
- data/vendor/prism/src/prettyprint.c +8941 -0
- data/vendor/prism/src/prism.c +23302 -0
- data/vendor/prism/src/regexp.c +790 -0
- data/vendor/prism/src/serialize.c +2268 -0
- data/vendor/prism/src/static_literals.c +617 -0
- data/vendor/prism/src/token_type.c +703 -0
- data/vendor/prism/src/util/pm_buffer.c +357 -0
- data/vendor/prism/src/util/pm_char.c +318 -0
- data/vendor/prism/src/util/pm_constant_pool.c +342 -0
- data/vendor/prism/src/util/pm_integer.c +670 -0
- data/vendor/prism/src/util/pm_list.c +49 -0
- data/vendor/prism/src/util/pm_memchr.c +35 -0
- data/vendor/prism/src/util/pm_newline_list.c +125 -0
- data/vendor/prism/src/util/pm_string.c +383 -0
- data/vendor/prism/src/util/pm_strncasecmp.c +36 -0
- data/vendor/prism/src/util/pm_strpbrk.c +206 -0
- data/vendor/prism/templates/ext/prism/api_node.c.erb +282 -0
- data/vendor/prism/templates/include/prism/ast.h.erb +226 -0
- data/vendor/prism/templates/include/prism/diagnostic.h.erb +130 -0
- data/vendor/prism/templates/java/org/prism/AbstractNodeVisitor.java.erb +22 -0
- data/vendor/prism/templates/java/org/prism/Loader.java.erb +434 -0
- data/vendor/prism/templates/java/org/prism/Nodes.java.erb +403 -0
- data/vendor/prism/templates/javascript/src/deserialize.js.erb +448 -0
- data/vendor/prism/templates/javascript/src/nodes.js.erb +197 -0
- data/vendor/prism/templates/javascript/src/visitor.js.erb +78 -0
- data/vendor/prism/templates/lib/prism/compiler.rb.erb +43 -0
- data/vendor/prism/templates/lib/prism/dispatcher.rb.erb +103 -0
- data/vendor/prism/templates/lib/prism/dot_visitor.rb.erb +189 -0
- data/vendor/prism/templates/lib/prism/dsl.rb.erb +133 -0
- data/vendor/prism/templates/lib/prism/inspect_visitor.rb.erb +131 -0
- data/vendor/prism/templates/lib/prism/mutation_compiler.rb.erb +19 -0
- data/vendor/prism/templates/lib/prism/node.rb.erb +515 -0
- data/vendor/prism/templates/lib/prism/reflection.rb.erb +136 -0
- data/vendor/prism/templates/lib/prism/serialize.rb.erb +602 -0
- data/vendor/prism/templates/lib/prism/visitor.rb.erb +55 -0
- data/vendor/prism/templates/rbi/prism/dsl.rbi.erb +68 -0
- data/vendor/prism/templates/rbi/prism/node.rbi.erb +164 -0
- data/vendor/prism/templates/rbi/prism/visitor.rbi.erb +18 -0
- data/vendor/prism/templates/sig/prism/_private/dot_visitor.rbs.erb +45 -0
- data/vendor/prism/templates/sig/prism/dsl.rbs.erb +31 -0
- data/vendor/prism/templates/sig/prism/mutation_compiler.rbs.erb +7 -0
- data/vendor/prism/templates/sig/prism/node.rbs.erb +132 -0
- data/vendor/prism/templates/sig/prism/visitor.rbs.erb +17 -0
- data/vendor/prism/templates/sig/prism.rbs.erb +89 -0
- data/vendor/prism/templates/src/diagnostic.c.erb +523 -0
- data/vendor/prism/templates/src/node.c.erb +333 -0
- data/vendor/prism/templates/src/prettyprint.c.erb +166 -0
- data/vendor/prism/templates/src/serialize.c.erb +406 -0
- data/vendor/prism/templates/src/token_type.c.erb +369 -0
- data/vendor/prism/templates/template.rb +689 -0
- metadata +112 -2
@@ -0,0 +1,245 @@
|
|
1
|
+
#include "include/array.h"
|
2
|
+
#include "include/errors.h"
|
3
|
+
#include "include/location.h"
|
4
|
+
#include "include/position.h"
|
5
|
+
#include "include/pretty_print.h"
|
6
|
+
#include "include/token.h"
|
7
|
+
#include "include/util.h"
|
8
|
+
|
9
|
+
#include <stdio.h>
|
10
|
+
#include <stdbool.h>
|
11
|
+
#include <stdlib.h>
|
12
|
+
#include <string.h>
|
13
|
+
|
14
|
+
#define ERROR_MESSAGES_TRUNCATED_LENGTH <%= Herb::Template::PrintfMessageTemplate::MAX_STRING_SIZE %>
|
15
|
+
|
16
|
+
size_t error_sizeof(void) {
|
17
|
+
return sizeof(struct ERROR_STRUCT);
|
18
|
+
}
|
19
|
+
|
20
|
+
void error_init(ERROR_T* error, const error_type_T type, position_T* start, position_T* end) {
|
21
|
+
if (!error) { return; }
|
22
|
+
|
23
|
+
error->type = type;
|
24
|
+
error->location = location_init(position_copy(start), position_copy(end));
|
25
|
+
}
|
26
|
+
<%- errors.each do |error| -%>
|
27
|
+
<%- error_arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name].join } : [] -%>
|
28
|
+
<%- arguments = error_arguments + ["position_T* start", "position_T* end"] -%>
|
29
|
+
|
30
|
+
<%= error.struct_type %>* <%= error.human %>_init(<%= arguments.join(", ") %>) {
|
31
|
+
<%= error.struct_type %>* <%= error.human %> = malloc(sizeof(<%= error.struct_type %>));
|
32
|
+
|
33
|
+
error_init(&<%= error.human %>->base, <%= error.type %>, start, end);
|
34
|
+
|
35
|
+
<%- if error.message_arguments.any? -%>
|
36
|
+
const char* message_template = "<%= error.message_template %>";
|
37
|
+
|
38
|
+
size_t message_size = <%= Herb::Template::PrintfMessageTemplate.estimate_buffer_size(error.message_template) %>;
|
39
|
+
char* message = (char*) malloc(message_size);
|
40
|
+
|
41
|
+
if (message) {
|
42
|
+
<%- error.message_arguments.each_with_index do |argument, i| -%>
|
43
|
+
<%- if error.message_template.scan(/%[sdulfz]/)[i] == "%s" -%>
|
44
|
+
char truncated_argument_<%= i %>[ERROR_MESSAGES_TRUNCATED_LENGTH + 1];
|
45
|
+
strncpy(truncated_argument_<%= i %>, <%= argument %>, ERROR_MESSAGES_TRUNCATED_LENGTH);
|
46
|
+
truncated_argument_<%= i %>[ERROR_MESSAGES_TRUNCATED_LENGTH] = '\0';
|
47
|
+
|
48
|
+
<%- end -%>
|
49
|
+
<%- end -%>
|
50
|
+
snprintf(
|
51
|
+
message,
|
52
|
+
message_size,
|
53
|
+
message_template,
|
54
|
+
<%- error.message_arguments.each_with_index do |argument, index| -%>
|
55
|
+
<%- if error.message_template.scan(/%[sdulfz]/)[index] == "%s" -%>
|
56
|
+
truncated_argument_<%= index %><% if index != error.message_arguments.length - 1 %>,<% end %>
|
57
|
+
<%- else -%>
|
58
|
+
<%= argument %><% if index != error.message_arguments.length - 1 %>,<% end %>
|
59
|
+
<%- end -%>
|
60
|
+
<%- end -%>
|
61
|
+
);
|
62
|
+
|
63
|
+
<%= error.human %>->base.message = herb_strdup(message);
|
64
|
+
free(message);
|
65
|
+
} else {
|
66
|
+
<%= error.human %>->base.message = herb_strdup("<%= error.message_template %>");
|
67
|
+
}
|
68
|
+
<%- else -%>
|
69
|
+
<%= error.human %>->base.message = herb_strdup("<%= error.message_template %>");
|
70
|
+
<%- end -%>
|
71
|
+
|
72
|
+
<%- error.fields.each do |field| -%>
|
73
|
+
<%- case field -%>
|
74
|
+
<%- when Herb::Template::PositionField -%>
|
75
|
+
<%= error.human %>-><%= field.name %> = position_copy(<%= field.name %>);
|
76
|
+
<%- when Herb::Template::TokenField -%>
|
77
|
+
<%= error.human %>-><%= field.name %> = token_copy(<%= field.name %>);
|
78
|
+
<%- when Herb::Template::TokenTypeField -%>
|
79
|
+
<%= error.human %>-><%= field.name %> = <%= field.name %>;
|
80
|
+
<%- when Herb::Template::SizeTField -%>
|
81
|
+
<%= error.human %>-><%= field.name %> = <%= field.name %>;
|
82
|
+
<%- when Herb::Template::StringField -%>
|
83
|
+
<%= error.human %>-><%= field.name %> = herb_strdup(<%= field.name %>);
|
84
|
+
<%- else -%>
|
85
|
+
<%= field.inspect %>
|
86
|
+
<%- end -%>
|
87
|
+
<%- end -%>
|
88
|
+
return <%= error.human %>;
|
89
|
+
}
|
90
|
+
|
91
|
+
void append_<%= error.human %>(<%= (arguments + ["array_T* errors"]).join(", ") %>) {
|
92
|
+
array_append(errors, <%= error.human %>_init(<%= arguments.map { |argument| argument.split(" ").last.strip }.join(", ") %>));
|
93
|
+
}
|
94
|
+
<%- end -%>
|
95
|
+
|
96
|
+
const char* error_type_to_string(ERROR_T* error) {
|
97
|
+
switch (error->type) {
|
98
|
+
<%- errors.each do |error| -%>
|
99
|
+
case <%= error.type %>: return "<%= error.type %>";
|
100
|
+
<%- end -%>
|
101
|
+
}
|
102
|
+
|
103
|
+
return "Unknown error_type_T";
|
104
|
+
}
|
105
|
+
|
106
|
+
const char* error_human_type(ERROR_T* error) {
|
107
|
+
switch (error->type) {
|
108
|
+
<%- errors.each do |error| -%>
|
109
|
+
case <%= error.type %>: return "<%= error.name %>";
|
110
|
+
<%- end -%>
|
111
|
+
}
|
112
|
+
|
113
|
+
return "Unknown error_type_T";
|
114
|
+
}
|
115
|
+
|
116
|
+
void error_free_base_error(ERROR_T* error) {
|
117
|
+
if (error == NULL) { return; }
|
118
|
+
|
119
|
+
if (error->location != NULL) { location_free(error->location); }
|
120
|
+
if (error->message != NULL) { free(error->message); }
|
121
|
+
|
122
|
+
free(error);
|
123
|
+
}
|
124
|
+
<%- errors.each do |error| -%>
|
125
|
+
<%- arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name].join }.join(", ") : "void" -%>
|
126
|
+
|
127
|
+
static void error_free_<%= error.human %>(<%= error.struct_type %>* <%= error.human %>) {
|
128
|
+
<%- if error.fields.none? -%>
|
129
|
+
/* no <%= error.struct_type %> specific fields to free up */
|
130
|
+
<%- end -%>
|
131
|
+
<%- error.fields.each do |field| -%>
|
132
|
+
<%- case field -%>
|
133
|
+
<%- when Herb::Template::PositionField -%>
|
134
|
+
if (<%= error.human %>-><%= field.name %> != NULL) { position_free(<%= error.human %>-><%= field.name %>); }
|
135
|
+
<%- when Herb::Template::TokenField -%>
|
136
|
+
if (<%= error.human %>-><%= field.name %> != NULL) { token_free(<%= error.human %>-><%= field.name %>); }
|
137
|
+
<%- when Herb::Template::TokenTypeField -%>
|
138
|
+
// token_type_T is part of struct
|
139
|
+
<%- when Herb::Template::SizeTField -%>
|
140
|
+
// size_t is part of struct
|
141
|
+
<%- when Herb::Template::StringField -%>
|
142
|
+
if (<%= error.human %>-><%= field.name %> != NULL) { free((char*) <%= error.human %>-><%= field.name %>); }
|
143
|
+
<%- else -%>
|
144
|
+
<%= field.inspect %>
|
145
|
+
<%- end -%>
|
146
|
+
<%- end -%>
|
147
|
+
|
148
|
+
error_free_base_error(&<%= error.human %>->base);
|
149
|
+
}
|
150
|
+
<%- end -%>
|
151
|
+
|
152
|
+
void error_free(ERROR_T* error) {
|
153
|
+
if (!error) { return; }
|
154
|
+
|
155
|
+
switch (error->type) {
|
156
|
+
<%- errors.each do |error| -%>
|
157
|
+
case <%= error.type %>: error_free_<%= error.human %>((<%= error.struct_type %>*) error); break;
|
158
|
+
<%- end -%>
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
void error_pretty_print_array(
|
163
|
+
const char* name, array_T* array, const size_t indent, const size_t relative_indent, const bool last_property,
|
164
|
+
buffer_T* buffer
|
165
|
+
) {
|
166
|
+
if (array == NULL) {
|
167
|
+
pretty_print_property(name, "∅", indent, relative_indent, last_property, buffer);
|
168
|
+
|
169
|
+
return;
|
170
|
+
}
|
171
|
+
|
172
|
+
if (array_size(array) == 0) {
|
173
|
+
pretty_print_property(name, "[]", indent, relative_indent, last_property, buffer);
|
174
|
+
|
175
|
+
return;
|
176
|
+
}
|
177
|
+
|
178
|
+
pretty_print_label(name, indent, relative_indent, last_property, buffer);
|
179
|
+
|
180
|
+
buffer_append(buffer, "(");
|
181
|
+
|
182
|
+
char count[16];
|
183
|
+
sprintf(count, "%zu", array_size(array));
|
184
|
+
buffer_append(buffer, count);
|
185
|
+
buffer_append(buffer, ")\n");
|
186
|
+
|
187
|
+
if (indent < 20) {
|
188
|
+
for (size_t i = 0; i < array_size(array); i++) {
|
189
|
+
ERROR_T* child = array_get(array, i);
|
190
|
+
pretty_print_indent(buffer, indent);
|
191
|
+
pretty_print_indent(buffer, relative_indent + 1);
|
192
|
+
|
193
|
+
if (i == array_size(array) - 1) {
|
194
|
+
buffer_append(buffer, "└── ");
|
195
|
+
} else {
|
196
|
+
buffer_append(buffer, "├── ");
|
197
|
+
}
|
198
|
+
|
199
|
+
error_pretty_print(child, indent + 1, relative_indent + 1, buffer);
|
200
|
+
|
201
|
+
if (i != array_size(array) - 1) { pretty_print_newline(indent + 1, relative_indent, buffer); }
|
202
|
+
}
|
203
|
+
}
|
204
|
+
}
|
205
|
+
|
206
|
+
<%- errors.each do |error| -%>
|
207
|
+
static void error_pretty_print_<%= error.human %>(<%= error.struct_type %>* error, const size_t indent, const size_t relative_indent, buffer_T* buffer) {
|
208
|
+
if (!error) { return; }
|
209
|
+
|
210
|
+
buffer_append(buffer, "@ ");
|
211
|
+
buffer_append(buffer, error_human_type((ERROR_T*) error));
|
212
|
+
buffer_append(buffer, " ");
|
213
|
+
|
214
|
+
pretty_print_location(error->base.location, buffer);
|
215
|
+
buffer_append(buffer, "\n");
|
216
|
+
|
217
|
+
pretty_print_quoted_property("message", error->base.message, indent, relative_indent, <%= error.fields.none? %>, buffer);
|
218
|
+
<%- error.fields.each_with_index do |field, index| -%>
|
219
|
+
<%- case field -%>
|
220
|
+
<%- when Herb::Template::PositionField -%>
|
221
|
+
pretty_print_position_property(error-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
|
222
|
+
<%- when Herb::Template::TokenField -%>
|
223
|
+
pretty_print_token_property(error-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
|
224
|
+
<%- when Herb::Template::TokenTypeField -%>
|
225
|
+
pretty_print_property(token_type_to_string(error-><%= field.name %>), "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
|
226
|
+
<%- when Herb::Template::SizeTField -%>
|
227
|
+
pretty_print_size_t_property(error-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
|
228
|
+
<%- when Herb::Template::StringField -%>
|
229
|
+
pretty_print_quoted_property("<%= field.name %>", error-><%= field.name %>, indent, relative_indent, <%= error.fields.length - 1 == index %>, buffer);
|
230
|
+
<%- else -%>
|
231
|
+
<%= field.inspect %>
|
232
|
+
<%- end -%>
|
233
|
+
<%- end -%>
|
234
|
+
}
|
235
|
+
|
236
|
+
<%- end -%>
|
237
|
+
void error_pretty_print(ERROR_T* error, const size_t indent, const size_t relative_indent, buffer_T* buffer) {
|
238
|
+
if (!error) { return; }
|
239
|
+
|
240
|
+
switch (error->type) {
|
241
|
+
<%- errors.each do |error| -%>
|
242
|
+
case <%= error.type %>: error_pretty_print_<%= error.human %>((<%= error.struct_type %>*) error, indent, relative_indent, buffer); break;
|
243
|
+
<%- end -%>
|
244
|
+
}
|
245
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#ifndef HERB_AST_NODES_H
|
2
|
+
#define HERB_AST_NODES_H
|
3
|
+
|
4
|
+
#include <stdbool.h>
|
5
|
+
#include <prism.h>
|
6
|
+
|
7
|
+
#include "array.h"
|
8
|
+
#include "buffer.h"
|
9
|
+
#include "position.h"
|
10
|
+
#include "location.h"
|
11
|
+
#include "token_struct.h"
|
12
|
+
#include "analyzed_ruby.h"
|
13
|
+
#include "element_source.h"
|
14
|
+
|
15
|
+
typedef enum {
|
16
|
+
<%- nodes.each do |node| -%>
|
17
|
+
<%= node.type.upcase %>,
|
18
|
+
<%- end -%>
|
19
|
+
} ast_node_type_T;
|
20
|
+
|
21
|
+
typedef struct AST_NODE_STRUCT {
|
22
|
+
ast_node_type_T type;
|
23
|
+
location_T* location;
|
24
|
+
// maybe a range too?
|
25
|
+
array_T* errors;
|
26
|
+
} AST_NODE_T;
|
27
|
+
|
28
|
+
<%- nodes.each do |node| -%>
|
29
|
+
<%- arguments = node.fields.any? ? node.fields.map { |field| [field.c_type, " ", field.name, ";"].join }.join("\n ") : "/* no additional fields */" -%>
|
30
|
+
|
31
|
+
typedef struct <%= node.struct_name %> {
|
32
|
+
AST_NODE_T base;
|
33
|
+
<%= arguments %>
|
34
|
+
} <%= node.struct_type %>;
|
35
|
+
<%- end -%>
|
36
|
+
|
37
|
+
<%- nodes.each do |node| -%>
|
38
|
+
<%- node_arguments = node.fields.any? ? node.fields.map { |field| [field.c_type, " ", field.name].join } : [] -%>
|
39
|
+
<%- arguments = node_arguments + ["position_T* start_position", "position_T* end_position", "array_T* errors"] -%>
|
40
|
+
<%= node.struct_type %>* ast_<%= node.human %>_init(<%= arguments.join(", ") %>);
|
41
|
+
<%- end -%>
|
42
|
+
|
43
|
+
const char* ast_node_type_to_string(AST_NODE_T* node);
|
44
|
+
const char* ast_node_human_type(AST_NODE_T* node);
|
45
|
+
|
46
|
+
#endif
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#ifndef HERB_ERRORS_H
|
2
|
+
#define HERB_ERRORS_H
|
3
|
+
|
4
|
+
#include "array.h"
|
5
|
+
#include "buffer.h"
|
6
|
+
#include "errors.h"
|
7
|
+
#include "location.h"
|
8
|
+
#include "position.h"
|
9
|
+
#include "token.h"
|
10
|
+
|
11
|
+
typedef enum {
|
12
|
+
<%- errors.each do |error| -%>
|
13
|
+
<%= error.type.upcase %>,
|
14
|
+
<%- end -%>
|
15
|
+
} error_type_T;
|
16
|
+
|
17
|
+
typedef struct ERROR_STRUCT {
|
18
|
+
error_type_T type;
|
19
|
+
location_T* location;
|
20
|
+
char* message;
|
21
|
+
} ERROR_T;
|
22
|
+
|
23
|
+
<%- errors.each do |error| -%>
|
24
|
+
<%- arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name, ";"].join }.join("\n ") : "/* no additional fields */" -%>
|
25
|
+
|
26
|
+
typedef struct {
|
27
|
+
ERROR_T base;
|
28
|
+
<%= arguments %>
|
29
|
+
} <%= error.struct_type %>;
|
30
|
+
<%- end -%>
|
31
|
+
|
32
|
+
<%- errors.each do |error| -%>
|
33
|
+
<%- error_arguments = error.fields.any? ? error.fields.map { |field| [field.c_type, " ", field.name].join } : [] -%>
|
34
|
+
<%- arguments = error_arguments + ["position_T* start", "position_T* end"] -%>
|
35
|
+
<%= error.struct_type %>* <%= error.human %>_init(<%= arguments.join(", ") %>);
|
36
|
+
void append_<%= error.human %>(<%= (arguments << "array_T* errors").join(", ") %>);
|
37
|
+
<%- end -%>
|
38
|
+
|
39
|
+
void error_init(ERROR_T* error, error_type_T type, position_T* start, position_T* end);
|
40
|
+
|
41
|
+
size_t error_sizeof(void);
|
42
|
+
error_type_T error_type(ERROR_T* error);
|
43
|
+
|
44
|
+
char* error_message(ERROR_T* error);
|
45
|
+
|
46
|
+
const char* error_type_to_string(ERROR_T* error);
|
47
|
+
const char* error_human_type(ERROR_T* error);
|
48
|
+
|
49
|
+
void error_free(ERROR_T* error);
|
50
|
+
|
51
|
+
void error_pretty_print(ERROR_T* error, size_t indent, size_t relative_indent, buffer_T* buffer);
|
52
|
+
|
53
|
+
void error_pretty_print_array(
|
54
|
+
const char* name, array_T* array, size_t indent, size_t relative_indent, bool last_property,
|
55
|
+
buffer_T* buffer
|
56
|
+
);
|
57
|
+
|
58
|
+
#endif
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
|
3
|
+
#include "include/array.h"
|
4
|
+
#include "include/visitor.h"
|
5
|
+
#include "include/ast_node.h"
|
6
|
+
#include "include/ast_nodes.h"
|
7
|
+
|
8
|
+
void herb_visit_node(const AST_NODE_T* node, bool (*visitor)(const AST_NODE_T*, void*), void* data) {
|
9
|
+
if (visitor(node, data) && node != NULL) {
|
10
|
+
herb_visit_child_nodes(node, visitor, data);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
void herb_visit_child_nodes(const AST_NODE_T *node, bool (*visitor)(const AST_NODE_T *node, void *data), void *data) {
|
15
|
+
if (node == NULL) {
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
|
19
|
+
switch (node->type) {
|
20
|
+
<%- nodes.each do |node| -%>
|
21
|
+
<%- if node.fields.count { |field| [Herb::Template::NodeField, Herb::Template::ArrayField].include?(field.class) }.positive? -%>
|
22
|
+
case <%= node.type %>: {
|
23
|
+
const <%= node.struct_type %>* <%= node.human %> = ((const <%= node.struct_type %> *) node);
|
24
|
+
|
25
|
+
<%- node.fields.each do |field| -%>
|
26
|
+
<%- case field -%>
|
27
|
+
<%- when Herb::Template::NodeField -%>
|
28
|
+
if (<%= node.human %>-><%= field.name %> != NULL) {
|
29
|
+
herb_visit_node((AST_NODE_T *) <%= node.human %>-><%= field.name %>, visitor, data);
|
30
|
+
}
|
31
|
+
|
32
|
+
<%- when Herb::Template::ArrayField -%>
|
33
|
+
if (<%= node.human %>-><%= field.name %> != NULL) {
|
34
|
+
for (size_t index = 0; index < array_size(<%= node.human %>-><%= field.name %>); index++) {
|
35
|
+
herb_visit_node(array_get(<%= node.human %>-><%= field.name %>, index), visitor, data);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
<%- end -%>
|
40
|
+
<%- end -%>
|
41
|
+
} break;
|
42
|
+
|
43
|
+
<%- end -%>
|
44
|
+
<%- end -%>
|
45
|
+
default: break;
|
46
|
+
}
|
47
|
+
}
|