61
61
typedef struct _rule_t {
62
62
byte rule_id ;
63
63
byte act ;
64
- uint16_t arg [] ;
64
+ const uint16_t * arg ;
65
65
} rule_t ;
66
66
67
67
enum {
@@ -81,42 +81,64 @@ enum {
81
81
#undef DEF_RULE_NC
82
82
};
83
83
84
+ // Define an array of actions corresponding to each rule
85
+ STATIC const uint8_t rule_act_table [] = {
84
86
#define or (n ) (RULE_ACT_OR | n )
85
87
#define and (n ) (RULE_ACT_AND | n )
86
88
#define and_ident (n ) (RULE_ACT_AND | n | RULE_ACT_ALLOW_IDENT )
87
89
#define and_blank (n ) (RULE_ACT_AND | n | RULE_ACT_ADD_BLANK )
88
90
#define one_or_more (RULE_ACT_LIST | 2 )
89
91
#define list (RULE_ACT_LIST | 1 )
90
92
#define list_with_end (RULE_ACT_LIST | 3 )
91
- #define tok (t ) (RULE_ARG_TOK | MP_TOKEN_##t)
92
- #define rule (r ) (RULE_ARG_RULE | RULE_##r)
93
- #define opt_rule (r ) (RULE_ARG_OPT_RULE | RULE_##r)
94
- #define DEF_RULE (rule , comp , kind , ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
95
- #define DEF_RULE_NC (rule , kind , ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
93
+
94
+ #define DEF_RULE (rule , comp , kind , ...) kind ,
95
+ #define DEF_RULE_NC (rule , kind , ...)
96
96
#include "py/grammar.h"
97
+ #undef DEF_RULE
98
+ #undef DEF_RULE_NC
99
+
100
+ 0 , // RULE_const_object
101
+
102
+ #define DEF_RULE (rule , comp , kind , ...)
103
+ #define DEF_RULE_NC (rule , kind , ...) kind ,
104
+ #include "py/grammar.h"
105
+ #undef DEF_RULE
106
+ #undef DEF_RULE_NC
107
+
97
108
#undef or
98
109
#undef and
110
+ #undef and_ident
111
+ #undef and_blank
112
+ #undef one_or_more
99
113
#undef list
100
114
#undef list_with_end
115
+ };
116
+
117
+ // Define the argument data for each rule
118
+ #define tok (t ) (RULE_ARG_TOK | MP_TOKEN_ ##t )
119
+ #define rule (r ) (RULE_ARG_RULE | RULE_ ##r )
120
+ #define opt_rule (r ) (RULE_ARG_OPT_RULE | RULE_ ##r )
121
+
122
+ #define DEF_RULE (rule , comp , kind , ...) static const uint16_t const rule_arg_ ##rule [ ] = { __VA_ARGS__ };
123
+ #define DEF_RULE_NC (rule , kind , ...) static const uint16_t const rule_arg_##rule[] = { __VA_ARGS__ };
124
+ #include "py/grammar.h"
125
+ #undef DEF_RULE
126
+ #undef DEF_RULE_NC
127
+
101
128
#undef tok
102
129
#undef rule
103
130
#undef opt_rule
104
- #undef one_or_more
105
- #undef DEF_RULE
106
- #undef DEF_RULE_NC
107
131
108
- STATIC const rule_t * const rules [] = {
109
- // define rules with a compile function
110
- #define DEF_RULE (rule , comp , kind , ...) & rule_ ##rule ,
132
+ // Define an array of pointers to corresponding rule data
133
+ STATIC const uint16_t * const rule_arg_table [] = {
134
+ #define DEF_RULE (rule , comp , kind , ...) & rule_arg_ ##rule [ 0 ] ,
111
135
#define DEF_RULE_NC (rule , kind , ...)
112
136
#include "py/grammar.h"
113
137
#undef DEF_RULE
114
138
#undef DEF_RULE_NC
115
139
NULL , // RULE_const_object
116
-
117
- // define rules without a compile function
118
140
#define DEF_RULE (rule , comp , kind , ...)
119
- #define DEF_RULE_NC (rule , kind , ...) & rule_ ##rule ,
141
+ #define DEF_RULE_NC (rule , kind , ...) & rule_arg_ ##rule [ 0 ] ,
120
142
#include "py/grammar.h"
121
143
#undef DEF_RULE
122
144
#undef DEF_RULE_NC
@@ -139,6 +161,10 @@ STATIC const char *const rule_name_table[] = {
139
161
};
140
162
#endif
141
163
164
+ #if (MICROPY_COMP_CONST_FOLDING && MICROPY_COMP_CONST ) || !MICROPY_ENABLE_DOC_STRING
165
+ static const rule_t rule_pass_stmt = {RULE_pass_stmt , (RULE_ACT_AND | 1 ), & rule_arg_pass_stmt [0 ]};
166
+ #endif
167
+
142
168
typedef struct _rule_stack_t {
143
169
size_t src_line : 8 * sizeof (size_t ) - 8 ; // maximum bits storing source line number
144
170
size_t rule_id : 8 ; // this must be large enough to fit largest rule number
@@ -214,27 +240,29 @@ STATIC void *parser_alloc(parser_t *parser, size_t num_bytes) {
214
240
return ret ;
215
241
}
216
242
217
- STATIC void push_rule (parser_t * parser , size_t src_line , const rule_t * rule , size_t arg_i ) {
243
+ STATIC void push_rule (parser_t * parser , size_t src_line , uint8_t rule_id , size_t arg_i ) {
218
244
if (parser -> rule_stack_top >= parser -> rule_stack_alloc ) {
219
245
rule_stack_t * rs = m_renew (rule_stack_t , parser -> rule_stack , parser -> rule_stack_alloc , parser -> rule_stack_alloc + MICROPY_ALLOC_PARSE_RULE_INC );
220
246
parser -> rule_stack = rs ;
221
247
parser -> rule_stack_alloc += MICROPY_ALLOC_PARSE_RULE_INC ;
222
248
}
223
249
rule_stack_t * rs = & parser -> rule_stack [parser -> rule_stack_top ++ ];
224
250
rs -> src_line = src_line ;
225
- rs -> rule_id = rule -> rule_id ;
251
+ rs -> rule_id = rule_id ;
226
252
rs -> arg_i = arg_i ;
227
253
}
228
254
229
255
STATIC void push_rule_from_arg (parser_t * parser , size_t arg ) {
230
256
assert ((arg & RULE_ARG_KIND_MASK ) == RULE_ARG_RULE || (arg & RULE_ARG_KIND_MASK ) == RULE_ARG_OPT_RULE );
231
257
size_t rule_id = arg & RULE_ARG_ARG_MASK ;
232
- push_rule (parser , parser -> lexer -> tok_line , rules [ rule_id ] , 0 );
258
+ push_rule (parser , parser -> lexer -> tok_line , rule_id , 0 );
233
259
}
234
260
235
- STATIC void pop_rule (parser_t * parser , const rule_t * * rule , size_t * arg_i , size_t * src_line ) {
261
+ STATIC void pop_rule (parser_t * parser , rule_t * rule , size_t * arg_i , size_t * src_line ) {
236
262
parser -> rule_stack_top -= 1 ;
237
- * rule = rules [parser -> rule_stack [parser -> rule_stack_top ].rule_id ];
263
+ rule -> rule_id = parser -> rule_stack [parser -> rule_stack_top ].rule_id ;
264
+ rule -> act = rule_act_table [rule -> rule_id ];
265
+ rule -> arg = rule_arg_table [rule -> rule_id ];
238
266
* arg_i = parser -> rule_stack [parser -> rule_stack_top ].arg_i ;
239
267
* src_line = parser -> rule_stack [parser -> rule_stack_top ].src_line ;
240
268
}
@@ -656,7 +684,7 @@ STATIC bool fold_constants(parser_t *parser, const rule_t *rule, size_t num_args
656
684
if (qstr_str (id )[0 ] == '_' ) {
657
685
pop_result (parser ); // pop const(value)
658
686
pop_result (parser ); // pop id
659
- push_result_rule (parser , 0 , rules [ RULE_pass_stmt ] , 0 ); // replace with "pass"
687
+ push_result_rule (parser , 0 , & rule_pass_stmt , 0 ); // replace with "pass"
660
688
return true;
661
689
}
662
690
@@ -782,7 +810,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
782
810
case MP_PARSE_EVAL_INPUT : top_level_rule = RULE_eval_input ; break ;
783
811
default : top_level_rule = RULE_file_input ;
784
812
}
785
- push_rule (& parser , lex -> tok_line , rules [ top_level_rule ] , 0 );
813
+ push_rule (& parser , lex -> tok_line , top_level_rule , 0 );
786
814
787
815
// parse!
788
816
@@ -797,7 +825,9 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
797
825
break ;
798
826
}
799
827
800
- pop_rule (& parser , & rule , & i , & rule_src_line );
828
+ rule_t rule_data ;
829
+ pop_rule (& parser , & rule_data , & i , & rule_src_line );
830
+ rule = & rule_data ;
801
831
n = rule -> act & RULE_ACT_ARG_MASK ;
802
832
803
833
/*
@@ -827,7 +857,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
827
857
} else {
828
858
assert (kind == RULE_ARG_RULE );
829
859
if (i + 1 < n ) {
830
- push_rule (& parser , rule_src_line , rule , i + 1 ); // save this or-rule
860
+ push_rule (& parser , rule_src_line , rule -> rule_id , i + 1 ); // save this or-rule
831
861
}
832
862
push_rule_from_arg (& parser , rule -> arg [i ]); // push child of or-rule
833
863
goto next_rule ;
@@ -879,7 +909,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
879
909
}
880
910
}
881
911
} else {
882
- push_rule (& parser , rule_src_line , rule , i + 1 ); // save this and-rule
912
+ push_rule (& parser , rule_src_line , rule -> rule_id , i + 1 ); // save this and-rule
883
913
push_rule_from_arg (& parser , rule -> arg [i ]); // push child of and-rule
884
914
goto next_rule ;
885
915
}
@@ -900,7 +930,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
900
930
// Pushing the "pass" rule here will overwrite any RULE_const_object
901
931
// entry that was on the result stack, allowing the GC to reclaim
902
932
// the memory from the const object when needed.
903
- push_result_rule (& parser , rule_src_line , rules [ RULE_pass_stmt ] , 0 );
933
+ push_result_rule (& parser , rule_src_line , & rule_pass_stmt , 0 );
904
934
break ;
905
935
}
906
936
}
@@ -1009,7 +1039,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
1009
1039
}
1010
1040
} else {
1011
1041
assert ((arg & RULE_ARG_KIND_MASK ) == RULE_ARG_RULE );
1012
- push_rule (& parser , rule_src_line , rule , i + 1 ); // save this list-rule
1042
+ push_rule (& parser , rule_src_line , rule -> rule_id , i + 1 ); // save this list-rule
1013
1043
push_rule_from_arg (& parser , arg ); // push child of list-rule
1014
1044
goto next_rule ;
1015
1045
}
0 commit comments