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.
This commit is contained in:
parent
dfe8980acf
commit
1039c5e699
31
py/parse.c
31
py/parse.c
|
@ -61,9 +61,6 @@
|
||||||
typedef struct _rule_t {
|
typedef struct _rule_t {
|
||||||
byte rule_id;
|
byte rule_id;
|
||||||
byte act;
|
byte act;
|
||||||
#ifdef USE_RULE_NAME
|
|
||||||
const char *rule_name;
|
|
||||||
#endif
|
|
||||||
uint16_t arg[];
|
uint16_t arg[];
|
||||||
} rule_t;
|
} rule_t;
|
||||||
|
|
||||||
|
@ -94,13 +91,8 @@ enum {
|
||||||
#define tok(t) (RULE_ARG_TOK | MP_TOKEN_##t)
|
#define tok(t) (RULE_ARG_TOK | MP_TOKEN_##t)
|
||||||
#define rule(r) (RULE_ARG_RULE | RULE_##r)
|
#define rule(r) (RULE_ARG_RULE | RULE_##r)
|
||||||
#define opt_rule(r) (RULE_ARG_OPT_RULE | RULE_##r)
|
#define opt_rule(r) (RULE_ARG_OPT_RULE | RULE_##r)
|
||||||
#ifdef USE_RULE_NAME
|
|
||||||
#define DEF_RULE(rule, comp, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, #rule, { __VA_ARGS__ } };
|
|
||||||
#define DEF_RULE_NC(rule, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, #rule, { __VA_ARGS__ } };
|
|
||||||
#else
|
|
||||||
#define DEF_RULE(rule, comp, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
|
#define DEF_RULE(rule, comp, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
|
||||||
#define DEF_RULE_NC(rule, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
|
#define DEF_RULE_NC(rule, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
|
||||||
#endif
|
|
||||||
#include "py/grammar.h"
|
#include "py/grammar.h"
|
||||||
#undef or
|
#undef or
|
||||||
#undef and
|
#undef and
|
||||||
|
@ -130,6 +122,23 @@ STATIC const rule_t *const rules[] = {
|
||||||
#undef DEF_RULE_NC
|
#undef DEF_RULE_NC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if USE_RULE_NAME
|
||||||
|
// Define an array of rule names corresponding to each rule
|
||||||
|
STATIC const char *const rule_name_table[] = {
|
||||||
|
#define DEF_RULE(rule, comp, kind, ...) #rule,
|
||||||
|
#define DEF_RULE_NC(rule, kind, ...)
|
||||||
|
#include "py/grammar.h"
|
||||||
|
#undef DEF_RULE
|
||||||
|
#undef DEF_RULE_NC
|
||||||
|
"", // RULE_const_object
|
||||||
|
#define DEF_RULE(rule, comp, kind, ...)
|
||||||
|
#define DEF_RULE_NC(rule, kind, ...) #rule,
|
||||||
|
#include "py/grammar.h"
|
||||||
|
#undef DEF_RULE
|
||||||
|
#undef DEF_RULE_NC
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _rule_stack_t {
|
typedef struct _rule_stack_t {
|
||||||
size_t src_line : 8 * sizeof(size_t) - 8; // maximum bits storing source line number
|
size_t src_line : 8 * sizeof(size_t) - 8; // maximum bits storing source line number
|
||||||
size_t rule_id : 8; // this must be large enough to fit largest rule number
|
size_t rule_id : 8; // this must be large enough to fit largest rule number
|
||||||
|
@ -313,8 +322,8 @@ void mp_parse_node_print(mp_parse_node_t pn, size_t indent) {
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
size_t n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns);
|
size_t n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns);
|
||||||
#ifdef USE_RULE_NAME
|
#if USE_RULE_NAME
|
||||||
printf("%s(%u) (n=%u)\n", rules[MP_PARSE_NODE_STRUCT_KIND(pns)]->rule_name, (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
|
printf("%s(%u) (n=%u)\n", rule_name_table[MP_PARSE_NODE_STRUCT_KIND(pns)], (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
|
||||||
#else
|
#else
|
||||||
printf("rule(%u) (n=%u)\n", (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
|
printf("rule(%u) (n=%u)\n", (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
|
||||||
#endif
|
#endif
|
||||||
|
@ -797,7 +806,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
||||||
for (int j = 0; j < parser.rule_stack_top; ++j) {
|
for (int j = 0; j < parser.rule_stack_top; ++j) {
|
||||||
printf(" ");
|
printf(" ");
|
||||||
}
|
}
|
||||||
printf("%s n=%d i=%d bt=%d\n", rule->rule_name, n, i, backtrack);
|
printf("%s n=%d i=%d bt=%d\n", rule_name_table[rule->rule_id], n, i, backtrack);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
switch (rule->act & RULE_ACT_KIND_MASK) {
|
switch (rule->act & RULE_ACT_KIND_MASK) {
|
||||||
|
|
Loading…
Reference in New Issue