+static expression_t *parse_function_keyword(void)
+{
+ eat(T___FUNCTION__);
+ /* TODO */
+
+ string_literal_t *expression = allocate_ast_zero(sizeof(expression[0]));
+ expression->expression.type = EXPR_FUNCTION;
+ expression->expression.datatype = type_string;
+ expression->value = "TODO: FUNCTION";
+
+ return (expression_t*) expression;
+}
+
+static expression_t *parse_pretty_function_keyword(void)
+{
+ eat(T___PRETTY_FUNCTION__);
+ /* TODO */
+
+ string_literal_t *expression = allocate_ast_zero(sizeof(expression[0]));
+ expression->expression.type = EXPR_PRETTY_FUNCTION;
+ expression->expression.datatype = type_string;
+ expression->value = "TODO: PRETTY FUNCTION";
+
+ return (expression_t*) expression;
+}
+
+static member_designator_t *parse_member_designators(void)
+{
+ member_designator_t *result = allocate_ast_zero(sizeof(result[0]));
+
+ if(token.type != T_IDENTIFIER) {
+ parse_error_expected("problem while parsing member designator",
+ T_IDENTIFIER, 0);
+ eat_brace();
+ return NULL;
+ }
+ result->symbol = token.v.symbol;
+ next_token();
+
+ member_designator_t *last_designator = result;
+ while(true) {
+ if(token.type == '.') {
+ next_token();
+ if(token.type != T_IDENTIFIER) {
+ parse_error_expected("problem while parsing member designator",
+ T_IDENTIFIER, 0);
+ eat_brace();
+ return NULL;
+ }
+ member_designator_t *designator
+ = allocate_ast_zero(sizeof(result[0]));
+ designator->symbol = token.v.symbol;
+ next_token();
+
+ last_designator->next = designator;
+ last_designator = designator;
+ continue;
+ }
+ if(token.type == '[') {
+ next_token();
+ member_designator_t *designator
+ = allocate_ast_zero(sizeof(result[0]));
+ designator->array_access = parse_expression();
+ if(designator->array_access == NULL) {
+ eat_brace();
+ return NULL;
+ }
+ expect(']');
+
+ last_designator->next = designator;
+ last_designator = designator;
+ continue;
+ }
+ break;
+ }
+
+ return result;
+}
+
+static expression_t *parse_offsetof(void)
+{
+ eat(T___builtin_offsetof);
+
+ offsetof_expression_t *expression
+ = allocate_ast_zero(sizeof(expression[0]));
+ expression->expression.type = EXPR_OFFSETOF;
+ expression->expression.datatype = type_size_t;
+
+ expect('(');
+ expression->type = parse_typename();
+ expect(',');
+ expression->member_designators = parse_member_designators();
+ expect(')');
+
+ return (expression_t*) expression;
+}
+
+static expression_t *parse_builtin_symbol(void)
+{
+ builtin_symbol_expression_t *expression
+ = allocate_ast_zero(sizeof(expression[0]));
+ expression->expression.type = EXPR_BUILTIN_SYMBOL;
+
+ /* TODO: set datatype */
+
+ expression->symbol = token.v.symbol;
+
+ next_token();
+
+ return (expression_t*) expression;
+}
+
+static expression_t *parse_primary_expression(void)