Skip to content

Commit 1039c5e

Browse files
committed
py/parse: Split out rule name from rule struct into separate array.
The rule name is only used for debugging, and this patch makes things a bit cleaner by completely separating out the rule name from the rest of the rule data.
1 parent dfe8980 commit 1039c5e

File tree

1 file changed

+22
-13
lines changed

1 file changed

+22
-13
lines changed

py/parse.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,6 @@
6161
typedef struct _rule_t {
6262
byte rule_id;
6363
byte act;
64-
#ifdef USE_RULE_NAME
65-
const char *rule_name;
66-
#endif
6764
uint16_t arg[];
6865
} rule_t;
6966

@@ -94,13 +91,8 @@ enum {
9491
#define tok(t) (RULE_ARG_TOK | MP_TOKEN_##t)
9592
#define rule(r) (RULE_ARG_RULE | RULE_##r)
9693
#define opt_rule(r) (RULE_ARG_OPT_RULE | RULE_##r)
97-
#ifdef USE_RULE_NAME
98-
#define DEF_RULE(rule, comp, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, #rule, { __VA_ARGS__ } };
99-
#define DEF_RULE_NC(rule, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, #rule, { __VA_ARGS__ } };
100-
#else
10194
#define DEF_RULE(rule, comp, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
10295
#define DEF_RULE_NC(rule, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
103-
#endif
10496
#include "py/grammar.h"
10597
#undef or
10698
#undef and
@@ -130,6 +122,23 @@ STATIC const rule_t *const rules[] = {
130122
#undef DEF_RULE_NC
131123
};
132124

125+
#if USE_RULE_NAME
126+
// Define an array of rule names corresponding to each rule
127+
STATIC const char *const rule_name_table[] = {
128+
#define DEF_RULE(rule, comp, kind, ...) #rule,
129+
#define DEF_RULE_NC(rule, kind, ...)
130+
#include "py/grammar.h"
131+
#undef DEF_RULE
132+
#undef DEF_RULE_NC
133+
"", // RULE_const_object
134+
#define DEF_RULE(rule, comp, kind, ...)
135+
#define DEF_RULE_NC(rule, kind, ...) #rule,
136+
#include "py/grammar.h"
137+
#undef DEF_RULE
138+
#undef DEF_RULE_NC
139+
};
140+
#endif
141+
133142
typedef struct _rule_stack_t {
134143
size_t src_line : 8 * sizeof(size_t) - 8; // maximum bits storing source line number
135144
size_t rule_id : 8; // this must be large enough to fit largest rule number
@@ -313,11 +322,11 @@ void mp_parse_node_print(mp_parse_node_t pn, size_t indent) {
313322
#endif
314323
} else {
315324
size_t n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns);
316-
#ifdef USE_RULE_NAME
317-
printf("%s(%u) (n=%u)\n", rules[MP_PARSE_NODE_STRUCT_KIND(pns)]->rule_name, (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
318-
#else
325+
#if USE_RULE_NAME
326+
printf("%s(%u) (n=%u)\n", rule_name_table[MP_PARSE_NODE_STRUCT_KIND(pns)], (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
327+
#else
319328
printf("rule(%u) (n=%u)\n", (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
320-
#endif
329+
#endif
321330
for (size_t i = 0; i < n; i++) {
322331
mp_parse_node_print(pns->nodes[i], indent + 2);
323332
}
@@ -797,7 +806,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
797806
for (int j = 0; j < parser.rule_stack_top; ++j) {
798807
printf(" ");
799808
}
800-
printf("%s n=%d i=%d bt=%d\n", rule->rule_name, n, i, backtrack);
809+
printf("%s n=%d i=%d bt=%d\n", rule_name_table[rule->rule_id], n, i, backtrack);
801810
*/
802811

803812
switch (rule->act & RULE_ACT_KIND_MASK) {

0 commit comments

Comments
 (0)