From: Matthias Kruk Date: Sun, 5 Jul 2020 08:14:46 +0000 (+0900) Subject: parser: Implement parsing of cast-expression and conditional-expression grammar types X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=1b84f3ca241cf81beda21dba11c308510e536334;p=ccc parser: Implement parsing of cast-expression and conditional-expression grammar types --- diff --git a/src/parser.c b/src/parser.c index 28e82af..18a9ea2 100644 --- a/src/parser.c +++ b/src/parser.c @@ -661,6 +661,91 @@ struct unary_expression *parse_unary_expression(void) } struct conditional_expression *parse_conditional_expression(void) +{ + struct conditional_expression *ce; + + ce = conditional_expression_new(); + + if(!ce) { + return(NULL); + } + + if(!(ce->lorexpr = parse_logical_or_expression())) { + free(ce); + ce = NULL; + } else { + int pos; + + pos = lex_getpos(); + ce->qmark = lex_gettoken(); + ce->expr = parse_expression(); + ce->colon = lex_gettoken(); + ce->cexpr = parse_conditional_expression(); + + if(!ce->qmark || ce->qmark->type != TOKEN_QMARK || !ce->expr || + !ce->colon || ce->colon->type != TOKEN_COLON || !ce->cexpr) { + /* it's not a ternary expression after all */ + + if(ce->expr) { + free(ce->expr); + } + + if(ce->cexpr) { + free(ce->cexpr); + } + + ce->qmark = NULL; + ce->colon = NULL; + lex_setpos(pos); + } + } +} + +struct cast_expression *parse_cast_expression(void) +{ + struct cast_expression *ce; + + ce = cast_expression_new(); + + if(!ce) { + return(NULL); + } + + if((ce->data.uexpr = parse_unary_expression())) { + ce->type = CAST_EXPR_UNARY; + } else { + int pos; + + pos = lex_getpos(); + + ce->data.cast.lparen = lex_gettoken(); + ce->data.cast.typename = parse_type_name(); + ce->data.cast.rparen = lex_gettoken(); + ce->data.cast.castexpr = parse_cast_expression(); + + if(ce->data.cast.lparen && ce->data.cast.typename && + ce->data.cast.rparen && ce->data.cast.castexpr && + ce->data.cast.lparen->type == TOKEN_LPAREN && + ce->data.cast.rparen->type == TOKEN_RPAREN) { + ce->type = CAST_EXPR_CAST; + } else { + free(ce->data.cast.typename); + free(ce->data.cast.castexpr); + lex_setpos(pos); + free(ce); + ce = NULL; + } + } + + return(ce); +} + +struct type_name *parse_type_name(void) +{ + return(NULL); +} + +struct logical_or_expression *parse_logical_or_expression(void) { return(NULL); }