}
va_list ap;
va_start(ap, message);
- errorf(HERE, "got %K, expected %#k", &token, &ap, ", ");
+ errorf(HERE, "got %K, expected %#k", &token, &ap, "a ");
va_end(ap);
}
designator = allocate_ast_zero(sizeof(designator[0]));
designator->source_position = token.source_position;
next_token();
+ add_anchor_token(']');
designator->array_index = parse_constant_expression();
+ rem_anchor_token(']');
expect(']');
break;
case '.':
} else
descend_into_subtype(path);
+ add_anchor_token('}');
sub = parse_sub_initializer(path, orig_type, top_path_level+1,
env);
+ rem_anchor_token('}');
if(type != NULL) {
ascend_from_subtype(path);
descend_into_subtype(&path);
+ add_anchor_token('}');
result = parse_sub_initializer(&path, env->type, 1, env);
+ rem_anchor_token('}');
max_index = path.max_index;
DEL_ARR_F(path.path);
return;
}
+ add_anchor_token('}');
do {
if(token.type != T_IDENTIFIER) {
parse_error_expected("while parsing enum entry", T_IDENTIFIER, 0);
eat_block();
+ rem_anchor_token('}');
return;
}
break;
next_token();
} while(token.type != '}');
+ rem_anchor_token('}');
expect('}');
type_t *type;
expect('(');
+ add_anchor_token(')');
expression_t *expression = NULL;
break;
}
+ rem_anchor_token(')');
expect(')');
type_t *typeof_type = allocate_type_zero(TYPE_TYPEOF, expression->base.source_position);
case T_declspec:
next_token();
expect('(');
+ add_anchor_token(')');
parse_microsoft_extended_decl_modifier(specifiers);
+ rem_anchor_token(')');
expect(')');
break;
static construct_type_t *parse_array_declarator(void)
{
eat('[');
+ add_anchor_token(']');
parsed_array_t *array = obstack_alloc(&temp_obst, sizeof(array[0]));
memset(array, 0, sizeof(array[0]));
array->size = parse_assignment_expression();
}
+ rem_anchor_token(']');
expect(']');
return (construct_type_t*) array;
static construct_type_t *parse_function_declarator(declaration_t *declaration)
{
eat('(');
+ add_anchor_token(')');
type_t *type;
if(declaration != NULL) {
construct_function_type->construct_type.kind = CONSTRUCT_FUNCTION;
construct_function_type->function_type = type;
+ rem_anchor_token(')');
expect(')');
end_error:
break;
case '(':
next_token();
+ add_anchor_token(')');
inner_types = parse_inner_declarator(declaration, may_be_abstract);
+ rem_anchor_token(')');
expect(')');
break;
default:
const declaration_specifiers_t *specifiers,
parsed_declaration_func finished_declaration)
{
+ add_anchor_token(';');
+ add_anchor_token('=');
+ add_anchor_token(',');
while(true) {
declaration_t *declaration = finished_declaration(ndeclaration);
expect(';');
end_error:
- ;
+ rem_anchor_token(';');
+ rem_anchor_token('=');
+ rem_anchor_token(',');
}
static declaration_t *finished_kr_declaration(declaration_t *declaration)
static void parse_compound_type_entries(declaration_t *compound_declaration)
{
eat('{');
+ add_anchor_token('}');
while(token.type != '}' && token.type != T_EOF) {
declaration_specifiers_t specifiers;
parse_compound_declarators(compound_declaration, &specifiers);
}
+ rem_anchor_token('}');
+
if(token.type == T_EOF) {
errorf(HERE, "EOF while parsing struct");
}
type_t *type = parse_typename();
+ /* matching add_anchor_token() is at call site */
+ rem_anchor_token(')');
expect(')');
if(token.type == '{') {
static expression_t *parse_brace_expression(void)
{
eat('(');
+ add_anchor_token(')');
switch(token.type) {
case '{':
}
expression_t *result = parse_expression();
+ rem_anchor_token(')');
expect(')');
return result;
}
if(token.type == '[') {
next_token();
+ add_anchor_token(']');
designator_t *designator = allocate_ast_zero(sizeof(result[0]));
designator->source_position = HERE;
designator->array_index = parse_expression();
+ rem_anchor_token(']');
expect(']');
if(designator->array_index == NULL) {
return NULL;
expression->base.type = type_size_t;
expect('(');
+ add_anchor_token(',');
type_t *type = parse_typename();
+ rem_anchor_token(',');
expect(',');
+ add_anchor_token(')');
designator_t *designator = parse_designator();
+ rem_anchor_token(')');
expect(')');
expression->offsetofe.type = type;
expression_t *expression = allocate_expression_zero(EXPR_VA_START);
expect('(');
+ add_anchor_token(',');
expression->va_starte.ap = parse_assignment_expression();
+ rem_anchor_token(',');
expect(',');
expression_t *const expr = parse_assignment_expression();
if (expr->kind == EXPR_REFERENCE) {
expression_t *expression = allocate_expression_zero(EXPR_BUILTIN_CONSTANT_P);
expect('(');
+ add_anchor_token(')');
expression->builtin_constant.value = parse_assignment_expression();
+ rem_anchor_token(')');
expect(')');
expression->base.type = type_int;
expression_t *expression = allocate_expression_zero(EXPR_BUILTIN_PREFETCH);
expect('(');
+ add_anchor_token(')');
expression->builtin_prefetch.adr = parse_assignment_expression();
if (token.type == ',') {
next_token();
next_token();
expression->builtin_prefetch.locality = parse_assignment_expression();
}
+ rem_anchor_token(')');
expect(')');
expression->base.type = type_void;
= allocate_expression_zero(EXPR_UNARY_ASSUME);
expect('(');
+ add_anchor_token(')');
expression->unary.value = parse_assignment_expression();
+ rem_anchor_token(')');
expect(')');
expression->base.type = type_void;
(void) precedence;
eat('[');
+ add_anchor_token(']');
expression_t *inside = parse_expression();
array_access->array_ref = create_invalid_expression();
}
+ rem_anchor_token(']');
if(token.type != ']') {
parse_error_expected("Problem while parsing array access", ']', 0);
return expression;
if(token.type == '(' && is_declaration_specifier(look_ahead(1), true)) {
next_token();
+ add_anchor_token(')');
tp_expression->typeprop.type = parse_typename();
+ rem_anchor_token(')');
expect(')');
} else {
expression_t *expression = parse_sub_expression(precedence);
/* parse arguments */
eat('(');
+ add_anchor_token(')');
+ add_anchor_token(',');
if(token.type != ')') {
call_argument_t *last_argument = NULL;
next_token();
}
}
+ rem_anchor_token(',');
+ rem_anchor_token(')');
expect(')');
if(function_type != NULL) {
expression_t *expression)
{
eat('?');
+ add_anchor_token(':');
expression_t *result = allocate_expression_zero(EXPR_CONDITIONAL);
}
expression_t *true_expression = parse_expression();
+ rem_anchor_token(':');
expect(':');
expression_t *false_expression = parse_sub_expression(precedence);
result->base.type = type_int;
expect('(');
+ add_anchor_token(')');
expression_t *expression = parse_sub_expression(precedence);
+ rem_anchor_token(')');
expect(')');
result->classify_type.type_expression = expression;
}
expect('(');
+ add_anchor_token(')');
+ add_anchor_token(':');
asm_statement->asm_text = parse_string_literals();
- if(token.type != ':')
+ if(token.type != ':') {
+ rem_anchor_token(':');
goto end_of_asm;
+ }
eat(':');
asm_statement->inputs = parse_asm_constraints();
- if(token.type != ':')
+ if(token.type != ':') {
+ rem_anchor_token(':');
goto end_of_asm;
+ }
eat(':');
asm_statement->outputs = parse_asm_constraints();
- if(token.type != ':')
+ if(token.type != ':') {
+ rem_anchor_token(':');
goto end_of_asm;
+ }
+ rem_anchor_token(':');
eat(':');
asm_statement->clobbers = parse_asm_clobbers();
end_of_asm:
+ rem_anchor_token(')');
expect(')');
expect(';');
return statement;
statement->base.source_position = token.source_position;
expect('(');
+ add_anchor_token(')');
statement->ifs.condition = parse_expression();
+ rem_anchor_token(')');
expect(')');
add_anchor_token(T_else);
statement->base.source_position = token.source_position;
expect('(');
+ add_anchor_token(')');
statement->whiles.condition = parse_expression();
+ rem_anchor_token(')');
expect(')');
statement->whiles.body = parse_loop_body(statement);
expect(T_while);
expect('(');
+ add_anchor_token(')');
statement->do_while.condition = parse_expression();
+ rem_anchor_token(')');
expect(')');
expect(';');
set_scope(&statement->fors.scope);
expect('(');
+ add_anchor_token(')');
if(token.type != ';') {
if(is_declaration_specifier(&token, false)) {
"step of 'for'-statement has no effect");
}
}
+ rem_anchor_token(')');
expect(')');
statement->fors.body = parse_loop_body(statement);
return statement;
end_error:
+ rem_anchor_token(')');
assert(scope == &statement->fors.scope);
set_scope(last_scope);
environment_pop_to(top);
statement_t *statement = NULL;
/* declaration or statement */
+ add_anchor_token(';');
switch(token.type) {
case T_asm:
statement = parse_asm_statement();
statement = parse_expression_statement();
break;
}
+ rem_anchor_token(';');
assert(statement == NULL
|| statement->base.source_position.input_name != NULL);
statement->base.source_position = token.source_position;
eat('{');
+ add_anchor_token('}');
int top = environment_top();
scope_t *last_scope = scope;
}
end_error:
+ rem_anchor_token('}');
assert(scope == &statement->compound.scope);
set_scope(last_scope);
environment_pop_to(top);