]> git.corax.cc Git - ccc/commitdiff
parser: Implement parsing of cast-expression and conditional-expression grammar types
authorMatthias Kruk <m@m10k.eu>
Sun, 5 Jul 2020 08:14:46 +0000 (17:14 +0900)
committerMatthias Kruk <m@m10k.eu>
Sun, 5 Jul 2020 08:14:46 +0000 (17:14 +0900)
src/parser.c

index 28e82afaed7bb2a50598b90ebb7ca2d897815664..18a9ea2d2914ef974f525cdbf05e569b27dc8ea4 100644 (file)
@@ -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);
 }