static sl_node_base_t* bracketed_expression(sl_parse_state_t* ps) { sl_node_base_t* node; expect_token(ps, SL_TOK_OPEN_PAREN); node = expression(ps); if(peek_token(ps)->type == SL_TOK_SEMICOLON) { sl_node_seq_t* seq = sl_make_seq_node(ps); sl_seq_node_append(ps, seq, node); while(peek_token(ps)->type == SL_TOK_SEMICOLON) { next_token(ps); sl_seq_node_append(ps, seq, expression(ps)); } node = (sl_node_base_t*)seq; } expect_token(ps, SL_TOK_CLOSE_PAREN); return node; }
static sl_node_base_t* statements(sl_parse_state_t* ps) { sl_node_seq_t* seq = sl_make_seq_node(ps); sl_node_base_t* node; while(peek_token(ps)->type != SL_TOK_END) { node = statement(ps); if(node) { sl_seq_node_append(ps, seq, node); } } return (sl_node_base_t*)seq; }
static sl_node_base_t* inline_raw(sl_parse_state_t* ps) { sl_node_seq_t* seq = sl_make_seq_node(ps); while(1) { switch(peek_token(ps)->type) { case SL_TOK_OPEN_ECHO_TAG: sl_seq_node_append(ps, seq, echo_tag(ps)); break; case SL_TOK_OPEN_RAW_ECHO_TAG: sl_seq_node_append(ps, seq, echo_raw_tag(ps)); break; case SL_TOK_RAW: sl_seq_node_append(ps, seq, sl_make_raw_node(ps, next_token(ps))); break; case SL_TOK_END: return (sl_node_base_t*)seq; case SL_TOK_OPEN_TAG: return (sl_node_base_t*)seq; default: break; } } }
static sl_node_base_t* body_expression(sl_parse_state_t* ps) { sl_node_seq_t* seq = sl_make_seq_node(ps); sl_node_base_t* node; expect_token(ps, SL_TOK_OPEN_BRACE); while(peek_token(ps)->type != SL_TOK_CLOSE_BRACE) { node = statement(ps); if(node) { sl_seq_node_append(ps, seq, node); } } expect_token(ps, SL_TOK_CLOSE_BRACE); return (sl_node_base_t*)seq; }