static struct initializer *parse_initializer(struct parser *parser) { union token tok = lexer_next_token(parser->lexer); struct initializer *initializer = initializer_init(); if (tok.tok_tag == TOK_LBRACE) { initializer->initz_list = parse_initializer_list(parser); } else { if (tok.tok_tag == TOK_DOT) { while (1) { union token idtok = expect(parser->lexer, TOK_IDENTIFIER); dynarr_add(initializer->namelist, idtok.id.s); tok = lexer_next_token(parser->lexer); if (tok.tok_tag == TOK_ASSIGN) { break; } assume(tok, TOK_DOT); } } else if (tok.tok_tag == TOK_LBRACKET) { initializer->ind = parse_constant_expression(parser); expect(parser->lexer, TOK_RBRACKET); expect(parser->lexer, TOK_ASSIGN); } else { lexer_put_back(parser->lexer, tok); } initializer->expr = parse_assignment_expression(parser); } return initializer; }
/* For external calls to parse_expressions() * parse_recursion_level is expected to be 0 */ static void parse_expression() { /* full expressions */ if (parse_assignment_expression()) return; parse_recursion_level++; accept_logical_OR_expression(); parse_conditional_expression(); parse_recursion_level--; }