summaryrefslogtreecommitdiffstatshomepage
path: root/py/parse.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-12-23 23:04:02 +1100
committerDamien George <damien.p.george@gmail.com>2017-12-28 23:08:00 +1100
commit1039c5e6998561c452cfc23a836eec374bef39bd (patch)
treec924af6139b0933ec14709e77a016f4ed9b8eb97 /py/parse.c
parentdfe8980acfc678bfa3270bd17b7b3e45958a0a3a (diff)
downloadmicropython-1039c5e6998561c452cfc23a836eec374bef39bd.tar.gz
micropython-1039c5e6998561c452cfc23a836eec374bef39bd.zip
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.
Diffstat (limited to 'py/parse.c')
-rw-r--r--py/parse.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/py/parse.c b/py/parse.c
index b80cc8fb1a..7fcdf2c432 100644
--- a/py/parse.c
+++ b/py/parse.c
@@ -61,9 +61,6 @@
typedef struct _rule_t {
byte rule_id;
byte act;
-#ifdef USE_RULE_NAME
- const char *rule_name;
-#endif
uint16_t arg[];
} rule_t;
@@ -94,13 +91,8 @@ enum {
#define tok(t) (RULE_ARG_TOK | MP_TOKEN_##t)
#define rule(r) (RULE_ARG_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_NC(rule, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
-#endif
#include "py/grammar.h"
#undef or
#undef and
@@ -130,6 +122,23 @@ STATIC const rule_t *const rules[] = {
#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 {
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
@@ -313,11 +322,11 @@ void mp_parse_node_print(mp_parse_node_t pn, size_t indent) {
#endif
} else {
size_t n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns);
-#ifdef 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);
-#else
+ #if USE_RULE_NAME
+ 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
printf("rule(%u) (n=%u)\n", (uint)MP_PARSE_NODE_STRUCT_KIND(pns), (uint)n);
-#endif
+ #endif
for (size_t i = 0; i < n; i++) {
mp_parse_node_print(pns->nodes[i], indent + 2);
}
@@ -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) {
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) {