struct struct_union_specifier *parse_struct_union_specifier(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct enum_specifier *parse_enum_specifier(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct typedef_name *parse_typedef_name(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct declaration_list *parse_declaration_list(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct compound_statement *parse_compound_statement(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct declarator *parse_declarator(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct declaration *parse_declaration(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct enumeration_constant *parse_enumeration_constant(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
/* TODO: Implement parsing of enumeration constants */
return(NULL);
}
struct expression *parse_expression(void)
{
/* TODO: Implement parsing of expressions */
-
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct type_name *parse_type_name(void)
{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}
struct postfix_expression *parse_postfix_expression(void)
{
+ struct postfix_expression *expr;
+ int pos;
+
+ expr = postfix_expression_new();
+
+ if(!expr) {
+ return(NULL);
+ }
+
+ if((expr->data.primary = parse_primary_expression())) {
+ expr->type = POSTFIX_EXPR_PRIMARY;
+ return(expr);
+ }
+
+ pos = lex_getpos();
+
+ expr->data.index.pfexpr = parse_postfix_expression();
+ expr->data.index.lbracket = lex_gettoken();
+ expr->data.index.expr = parse_expression();
+ expr->data.index.rbracket = lex_gettoken();
+
+ if(expr->data.index.pfexpr && expr->data.index.lbracket && expr->data.index.expr &&
+ expr->data.index.rbracket && expr->data.index.lbracket->type == TOKEN_LBRACKET &&
+ expr->data.index.rbracket->type == TOKEN_RBRACKET) {
+ expr->type = POSTFIX_EXPR_INDEX;
+ return(expr);
+ }
+
+ if(expr->data.index.pfexpr) {
+ postfix_expression_free(expr->data.index.pfexpr);
+ expr->data.index.pfexpr = NULL;
+ }
+
+ if(expr->data.index.expr) {
+ expression_free(expr->data.index.expr);
+ expr->data.index.expr = NULL;
+ }
+
+ expr->data.index.lbracket = NULL;
+ expr->data.index.rbracket = NULL;
+
+ lex_setpos(pos);
+
+ expr->data.call.pfexpr = parse_postfix_expression();
+ expr->data.call.lparen = lex_gettoken();
+ expr->data.call.args = parse_argument_expression_list();
+ expr->data.call.rparen = lex_gettoken();
+
+ if(expr->data.call.pfexpr && expr->data.call.lparen && expr->data.call.args && expr->data.call.rparen &&
+ expr->data.call.lparen->type == TOKEN_LPAREN && expr->data.call.rparen->type == TOKEN_RPAREN) {
+ expr->type = POSTFIX_EXPR_CALL;
+ return(expr);
+ }
+
+ if(expr->data.call.pfexpr) {
+ postfix_expression_free(expr->data.call.pfexpr);
+ expr->data.call.pfexpr = NULL;
+ }
+
+ if(expr->data.call.args) {
+ argument_expression_list_free(expr->data.call.args);
+ expr->data.call.args = NULL;
+ }
+
+ expr->data.call.lparen = NULL;
+ expr->data.call.rparen = NULL;
+
+ lex_setpos(pos);
+
+ expr->data.member.pfexpr = parse_postfix_expression();
+ expr->data.member.op = lex_gettoken();
+ expr->data.member.identifier = parse_identifier();
+
+ if(expr->data.member.pfexpr && expr->data.member.op &&
+ expr->data.member.identifier && (expr->data.member.op->type == TOKEN_DMEMBER ||
+ expr->data.member.op->type == TOKEN_MEMBER)) {
+ expr->type = POSTFIX_EXPR_MEMBER;
+ return(expr);
+ }
+
+ if(expr->data.member.pfexpr) {
+ postfix_expression_free(expr->data.member.pfexpr);
+ expr->data.member.pfexpr = NULL;
+ }
+
+ if(expr->data.member.identifier) {
+ identifier_free(expr->data.member.identifier);
+ expr->data.member.identifier = NULL;
+ }
+
+ expr->data.member.op = NULL;
+
+ lex_setpos(pos);
+
+ expr->data.incdec.pfexpr = parse_postfix_expression();
+ expr->data.incdec.op = lex_gettoken();
+
+ if(expr->data.incdec.pfexpr && expr->data.incdec.op && (expr->data.incdec.op->type == TOKEN_INC ||
+ expr->data.incdec.op->type == TOKEN_DEC)) {
+ expr->type = POSTFIX_EXPR_INCDEC;
+ return(expr);
+ }
+
+ if(expr->data.incdec.pfexpr) {
+ postfix_expression_free(expr->data.incdec.pfexpr);
+ expr->data.incdec.pfexpr = NULL;
+ }
+
+ lex_setpos(pos);
+ free(expr);
+
+ return(NULL);
+}
+
+struct argument_expression_list *parse_argument_expression_list(void)
+{
+ fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
return(NULL);
}