Skip to content

Commit c5e09d0

Browse files
martin-csAalok Thakkar
authored and
Aalok Thakkar
committed
Parser support for assigns contracts on loops
1. Renamed cprover_contract_assigns_opt to cprover_contract_assigns. 2. Created cprover_contract_assigns_opt which has a unit production and cprover_contract_assigns. 3. Renamed cprover_decreases_opt to cprover_contract_decreases_opt. 4. Added cprover_contract_assigns_opt to iteration statement. This adds parser support for assigns contracts on loops.
1 parent 8e692ae commit c5e09d0

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

src/ansi-c/parser.y

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -491,14 +491,14 @@ quantifier_expression:
491491
}
492492
;
493493

494-
loop_invariant_opt:
494+
cprover_contract_invariant_opt:
495495
/* nothing */
496496
{ init($$); parser_stack($$).make_nil(); }
497497
| TOK_CPROVER_LOOP_INVARIANT '(' ACSL_binding_expression ')'
498498
{ $$=$3; }
499499
;
500500

501-
cprover_decreases_opt:
501+
cprover_contract_decreases_opt:
502502
/* nothing */
503503
{ init($$); parser_stack($$).make_nil(); }
504504
| TOK_CPROVER_DECREASES '(' ACSL_binding_expression ')'
@@ -2426,31 +2426,35 @@ declaration_or_expression_statement:
24262426

24272427
iteration_statement:
24282428
TOK_WHILE '(' comma_expression_opt ')'
2429-
loop_invariant_opt cprover_decreases_opt
2429+
cprover_contract_assigns_opt
2430+
cprover_contract_invariant_opt
2431+
cprover_contract_decreases_opt
24302432
statement
24312433
{
24322434
$$=$1;
24332435
statement($$, ID_while);
2434-
parser_stack($$).add_to_operands(std::move(parser_stack($3)), std::move(parser_stack($7)));
2435-
2436-
if(parser_stack($5).is_not_nil())
2437-
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($5));
2436+
parser_stack($$).add_to_operands(std::move(parser_stack($3)), std::move(parser_stack($8)));
24382437

24392438
if(parser_stack($6).is_not_nil())
2440-
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($6));
2439+
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($6));
2440+
2441+
if(parser_stack($7).is_not_nil())
2442+
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($7));
24412443
}
24422444
| TOK_DO statement TOK_WHILE '(' comma_expression ')'
2443-
loop_invariant_opt cprover_decreases_opt ';'
2445+
cprover_contract_assigns_opt
2446+
cprover_contract_invariant_opt
2447+
cprover_contract_decreases_opt ';'
24442448
{
24452449
$$=$1;
24462450
statement($$, ID_dowhile);
24472451
parser_stack($$).add_to_operands(std::move(parser_stack($5)), std::move(parser_stack($2)));
24482452

2449-
if(parser_stack($7).is_not_nil())
2450-
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($7));
2451-
24522453
if(parser_stack($8).is_not_nil())
2453-
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($8));
2454+
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($8));
2455+
2456+
if(parser_stack($9).is_not_nil())
2457+
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($9));
24542458
}
24552459
| TOK_FOR
24562460
{
@@ -2464,7 +2468,9 @@ iteration_statement:
24642468
'(' declaration_or_expression_statement
24652469
comma_expression_opt ';'
24662470
comma_expression_opt ')'
2467-
loop_invariant_opt cprover_decreases_opt
2471+
cprover_contract_assigns_opt
2472+
cprover_contract_invariant_opt
2473+
cprover_contract_decreases_opt
24682474
statement
24692475
{
24702476
$$=$1;
@@ -2473,13 +2479,13 @@ iteration_statement:
24732479
mto($$, $4);
24742480
mto($$, $5);
24752481
mto($$, $7);
2476-
mto($$, $11);
2477-
2478-
if(parser_stack($9).is_not_nil())
2479-
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($9));
2482+
mto($$, $12);
24802483

24812484
if(parser_stack($10).is_not_nil())
2482-
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($10));
2485+
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($10));
2486+
2487+
if(parser_stack($11).is_not_nil())
2488+
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($11));
24832489

24842490
if(PARSER.for_has_scope)
24852491
PARSER.pop_scope(); // remove the C99 for-scope
@@ -3261,10 +3267,10 @@ cprover_function_contract:
32613267
set($$, ID_C_spec_requires);
32623268
mto($$, $3);
32633269
}
3264-
| cprover_contract_assigns_opt
3270+
| cprover_contract_assigns
32653271
;
32663272

3267-
cprover_contract_assigns_opt:
3273+
cprover_contract_assigns:
32683274
TOK_CPROVER_ASSIGNS '(' argument_expression_list ')'
32693275
{
32703276
$$=$1;
@@ -3274,6 +3280,12 @@ cprover_contract_assigns_opt:
32743280
}
32753281
;
32763282

3283+
cprover_contract_assigns_opt:
3284+
/* nothing */
3285+
{ init($$); parser_stack($$).make_nil(); }
3286+
| cprover_contract_assigns
3287+
;
3288+
32773289
cprover_function_contract_sequence:
32783290
cprover_function_contract
32793291
| cprover_function_contract_sequence cprover_function_contract
@@ -3552,4 +3564,4 @@ parameter_postfix_abstract_declarator:
35523564
}
35533565
;
35543566

3555-
%%
3567+
%%

0 commit comments

Comments
 (0)