}
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);
}