Skip to content

Commit 990341f

Browse files
author
Aalok Thakkar
committed
Added assigns clauses for loops
1. Renamed cprover_contract_assigns_opt to cprover_contract_assigns as it did not have unit production. 2. Created cprover_contract_assigns_opt that supports unit productions 3. Added cprover_contract_assigns_opt to iteration_statement. 4. Renamed loop_invariant_opt to cprover_contract_invariant_opt for consistency. 5. Renamed loop_decreases_opt to cprover_contract_decreases_opt for consistency. This adds support for parsing assigns clauses for loops.
1 parent 99ccbcd commit 990341f

File tree

1 file changed

+44
-21
lines changed

1 file changed

+44
-21
lines changed

src/ansi-c/parser.y

Lines changed: 44 additions & 21 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,36 @@ declaration_or_expression_statement:
24262426

24272427
iteration_statement:
24282428
TOK_WHILE '(' comma_expression_opt ')'
2429-
loop_invariant_opt cprover_decreases_opt
2429+
2430+
cprover_contract_assigns_opt
2431+
cprover_contract_invariant_opt
2432+
cprover_contract_decreases_opt
24302433
statement
24312434
{
24322435
$$=$1;
24332436
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));
2437+
parser_stack($$).add_to_operands(std::move(parser_stack($3)), std::move(parser_stack($8)));
24382438

24392439
if(parser_stack($6).is_not_nil())
2440-
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($6));
2440+
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($6));
2441+
2442+
if(parser_stack($7).is_not_nil())
2443+
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($7));
24412444
}
24422445
| TOK_DO statement TOK_WHILE '(' comma_expression ')'
2443-
loop_invariant_opt cprover_decreases_opt ';'
2446+
cprover_contract_assigns_opt
2447+
cprover_contract_invariant_opt
2448+
cprover_contract_decreases_opt ';'
24442449
{
24452450
$$=$1;
24462451
statement($$, ID_dowhile);
24472452
parser_stack($$).add_to_operands(std::move(parser_stack($5)), std::move(parser_stack($2)));
24482453

2449-
if(parser_stack($7).is_not_nil())
2450-
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($7));
2451-
24522454
if(parser_stack($8).is_not_nil())
2453-
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($8));
2455+
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($8));
2456+
2457+
if(parser_stack($9).is_not_nil())
2458+
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($9));
24542459
}
24552460
| TOK_FOR
24562461
{
@@ -2464,7 +2469,9 @@ iteration_statement:
24642469
'(' declaration_or_expression_statement
24652470
comma_expression_opt ';'
24662471
comma_expression_opt ')'
2467-
loop_invariant_opt cprover_decreases_opt
2472+
cprover_contract_assigns_opt
2473+
cprover_contract_invariant_opt
2474+
cprover_contract_decreases_opt
24682475
statement
24692476
{
24702477
$$=$1;
@@ -2473,13 +2480,13 @@ iteration_statement:
24732480
mto($$, $4);
24742481
mto($$, $5);
24752482
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));
2483+
mto($$, $12);
24802484

24812485
if(parser_stack($10).is_not_nil())
2482-
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($10));
2486+
parser_stack($$).add(ID_C_spec_loop_invariant).swap(parser_stack($10));
2487+
2488+
if(parser_stack($11).is_not_nil())
2489+
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($11));
24832490

24842491
if(PARSER.for_has_scope)
24852492
PARSER.pop_scope(); // remove the C99 for-scope
@@ -3261,10 +3268,10 @@ cprover_function_contract:
32613268
set($$, ID_C_spec_requires);
32623269
mto($$, $3);
32633270
}
3264-
| cprover_contract_assigns_opt
3271+
| cprover_contract_assigns
32653272
;
32663273

3267-
cprover_contract_assigns_opt:
3274+
cprover_contract_assigns:
32683275
TOK_CPROVER_ASSIGNS '(' argument_expression_list ')'
32693276
{
32703277
$$=$1;
@@ -3274,6 +3281,16 @@ cprover_contract_assigns_opt:
32743281
}
32753282
;
32763283

3284+
cprover_contract_assigns_opt:
3285+
/* nothing */
3286+
{ init($$); parser_stack($$).make_nil(); }
3287+
| cprover_contract_assigns
3288+
;
3289+
3290+
<<<<<<< HEAD
3291+
=======
3292+
3293+
>>>>>>> 36ca4e761... update
32773294
cprover_function_contract_sequence:
32783295
cprover_function_contract
32793296
| cprover_function_contract_sequence cprover_function_contract
@@ -3289,6 +3306,12 @@ cprover_function_contract_sequence_opt:
32893306
| cprover_function_contract_sequence
32903307
;
32913308

3309+
cprover_loop_contract:
3310+
cprover_contract_assigns_opt
3311+
loop_invariant_opt
3312+
| loop_invariant_opt
3313+
;
3314+
32923315
postfixing_abstract_declarator:
32933316
parameter_postfixing_abstract_declarator
32943317
/* The following two rules implement K&R headers! */

0 commit comments

Comments
 (0)