2828#include <stdint.h>
2929#include <stdio.h>
3030#include <assert.h>
31+ #include <memory.h>
3132
3233#include "misc.h"
3334#include "mpconfig.h"
7071#include "grammar.h"
7172#undef DEF_RULE
7273 RULE_maximum_number_of ,
74+ RULE_string ,
7375};
7476
7577#define or (n ) (RULE_ACT_OR | n)
@@ -218,6 +220,9 @@ void mp_parse_node_print(mp_parse_node_t pn, int indent) {
218220 case MP_PARSE_NODE_TOKEN : printf ("tok(" INT_FMT ")\n" , arg ); break ;
219221 default : assert (0 );
220222 }
223+ } else if (MP_PARSE_NODE_IS_STRING (pn )) {
224+ mp_parse_node_struct_t * pns = (mp_parse_node_struct_t * )pn ;
225+ printf ("literal str(%.*s)\n" , (int )pns -> nodes [1 ], (char * )pns -> nodes [0 ]);
221226 } else {
222227 mp_parse_node_struct_t * pns = (mp_parse_node_struct_t * )pn ;
223228 uint n = MP_PARSE_NODE_STRUCT_NUM_NODES (pns );
@@ -274,6 +279,8 @@ STATIC void push_result_node(parser_t *parser, mp_parse_node_t pn) {
274279 parser -> result_stack [parser -> result_stack_top ++ ] = pn ;
275280}
276281
282+ STATIC void push_string (parser_t * parser , int src_line , const char * str , uint len );
283+
277284STATIC void push_result_token (parser_t * parser , const mp_lexer_t * lex ) {
278285 const mp_token_t * tok = mp_lexer_cur (lex );
279286 mp_parse_node_t pn ;
@@ -319,7 +326,10 @@ STATIC void push_result_token(parser_t *parser, const mp_lexer_t *lex) {
319326 pn = mp_parse_node_new_leaf (MP_PARSE_NODE_INTEGER , qstr_from_strn (str , len ));
320327 }
321328 } else if (tok -> kind == MP_TOKEN_STRING ) {
322- pn = mp_parse_node_new_leaf (MP_PARSE_NODE_STRING , qstr_from_strn (tok -> str , tok -> len ));
329+ printf ("Pushing string\n" );
330+ push_string (parser , mp_lexer_cur (lex )-> src_line , tok -> str , tok -> len );
331+ return ;
332+ // pn = mp_parse_node_new_leaf(MP_PARSE_NODE_STRING, qstr_from_strn(tok->str, tok->len));
323333 } else if (tok -> kind == MP_TOKEN_BYTES ) {
324334 pn = mp_parse_node_new_leaf (MP_PARSE_NODE_BYTES , qstr_from_strn (tok -> str , tok -> len ));
325335 } else {
@@ -328,6 +338,21 @@ STATIC void push_result_token(parser_t *parser, const mp_lexer_t *lex) {
328338 push_result_node (parser , pn );
329339}
330340
341+ STATIC void push_string (parser_t * parser , int src_line , const char * str , uint len ) {
342+ mp_parse_node_struct_t * pn = m_new_obj_var_maybe (mp_parse_node_struct_t , mp_parse_node_t , 2 );
343+ if (pn == NULL ) {
344+ memory_error (parser );
345+ return ;
346+ }
347+ pn -> source_line = src_line ;
348+ pn -> kind_num_nodes = RULE_string | (2 << 8 );
349+ char * p = m_new (char , len );
350+ memcpy (p , str , len );
351+ pn -> nodes [0 ] = (machine_int_t )p ;
352+ pn -> nodes [1 ] = len ;
353+ push_result_node (parser , (mp_parse_node_t )pn );
354+ }
355+
331356STATIC void push_result_rule (parser_t * parser , int src_line , const rule_t * rule , int num_args ) {
332357 mp_parse_node_struct_t * pn = m_new_obj_var_maybe (mp_parse_node_struct_t , mp_parse_node_t , num_args );
333358 if (pn == NULL ) {
@@ -516,12 +541,12 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
516541 }
517542 }
518543
519- #if 0 && !MICROPY_ENABLE_DOC_STRING
544+ #if 1 && !MICROPY_ENABLE_DOC_STRING
520545 // this code discards lonely statement, such as doc strings
521546 // problem is that doc strings have already been interned, so this doesn't really help reduce RAM usage
522547 if (input_kind != MP_PARSE_SINGLE_INPUT && rule -> rule_id == RULE_expr_stmt && peek_result (& parser , 0 ) == MP_PARSE_NODE_NULL ) {
523548 mp_parse_node_t p = peek_result (& parser , 1 );
524- if (MP_PARSE_NODE_IS_LEAF (p ) && !MP_PARSE_NODE_IS_ID (p )) {
549+ if (( MP_PARSE_NODE_IS_LEAF (p ) && !MP_PARSE_NODE_IS_ID ( p )) || MP_PARSE_NODE_IS_STRING (p )) {
525550 pop_result (parser );
526551 pop_result (parser );
527552 push_result_rule (& parser , rule_src_line , rules [RULE_pass_stmt ], 0 );
0 commit comments