From b95720ff18fe7da9077dddc402e6961bb4bf30d2 Mon Sep 17 00:00:00 2001 From: Patrick Baudin <patrick.baudin@cea.fr> Date: Fri, 18 Jan 2019 09:26:23 +0100 Subject: [PATCH] [ACSL] fixes acceptance of '//@ for behavior-list: extented-annotation;' --- src/kernel_internals/parsing/logic_parser.mly | 84 +++++++++++-------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/src/kernel_internals/parsing/logic_parser.mly b/src/kernel_internals/parsing/logic_parser.mly index 0907ce86f11..b3d773f74b3 100644 --- a/src/kernel_internals/parsing/logic_parser.mly +++ b/src/kernel_internals/parsing/logic_parser.mly @@ -1110,7 +1110,9 @@ clause_kw: /* often, we'll be in c_kw_mode, where these keywords are recognized as identifiers... */ | IDENTIFIER { $1 } +| EXT_CONTRACT { $1 } | EOF { "end of annotation" } +; requires: | /* epsilon */ { [] } @@ -1270,43 +1272,33 @@ custom_tree: ; custom_tree_list: -| custom_tree { [$1] } -| custom_tree COMMA custom_tree_list { $1::$3 } +| custom_tree { [$1] } +| custom_tree COMMA custom_tree_list { $1::$3 } +; annotation: | loop_annotations { let (b,v,p) = $1 in - (* TODO: do better, do not lose the structure ! *) - let l = b@v@p in + (* TODO: do better, do not lose the structure ! *) + let l = b@v@p in Aloop_annot (loc (), l) } -| FOR ne_behavior_name_list COLON contract - { let s, pos = $4 in Acode_annot (pos, AStmtSpec ($2,s)) } -| code_annotation { Acode_annot (loc(),$1) } -| code_annotation beg_code_annotation +| FOR ne_behavior_name_list COLON contract_or_code_annotation + { $4 $2 } +| pragma_or_code_annotation { Acode_annot (loc(),$1) } +| pragma_or_code_annotation beg_pragma_or_code_annotation { raise (Not_well_formed (loc(), "Only one code annotation is allowed per comment")) } -| EXT_CODE_ANNOT grammar_extension SEMICOLON - { - let open Cil_types in - let ext = $1 in - match Logic_env.extension_category ext with - | Some (Ext_code_annot (Ext_here | Ext_next_stmt | Ext_next_both)) -> - Acode_annot (loc(), Logic_ptree.AExtended([],false,(ext,$2))) - | Some (Ext_code_annot Ext_next_loop) -> - raise - (Not_well_formed - (lexeme_loc 1, - ext ^ " is not a loop annotation extension. It can't be used as \ - plain code annotation extension")) - | Some (Ext_contract | Ext_global) | None -> - Kernel.fatal ~source:(lexeme_start 1) - "%s is not a code annotation extension. Parser got wrong lexeme" ext - } | full_identifier_or_typename { Aattribute_annot (loc (), $1) } ; +contract_or_code_annotation: +| contract + { fun bhvs -> let s, pos = $1 in Acode_annot (pos, AStmtSpec (bhvs,s)) } +| code_annotation { fun bhvs -> Acode_annot (loc(), ($1 bhvs)) } +; + /*** loop annotations ***/ loop_annotations: @@ -1433,23 +1425,42 @@ loop_pragma: /*** code annotations ***/ -beg_code_annotation: +beg_pragma_or_code_annotation: | IMPACT {} | SLICE {} | FOR {} | ASSERT {} | INVARIANT {} +| EXT_CODE_ANNOT {} ; -code_annotation: +pragma_or_code_annotation: | slice_pragma { APragma (Slice_pragma $1) } | impact_pragma { APragma (Impact_pragma $1) } -| FOR ne_behavior_name_list COLON ASSERT full_lexpr SEMICOLON - { AAssert ($2,$5) } -| FOR ne_behavior_name_list COLON INVARIANT full_lexpr SEMICOLON - { AInvariant ($2,false,$5) } -| ASSERT full_lexpr SEMICOLON { AAssert ([],$2) } -| INVARIANT full_lexpr SEMICOLON { AInvariant ([],false,$2) } +| code_annotation { $1 [] } +; + +code_annotation: +| ASSERT full_lexpr SEMICOLON + { fun bhvs -> AAssert (bhvs,$2) } +| INVARIANT full_lexpr SEMICOLON { fun bhvs -> AInvariant (bhvs,false,$2) } +| EXT_CODE_ANNOT grammar_extension SEMICOLON + { fun bhvs -> + let open Cil_types in + let ext = $1 in + match Logic_env.extension_category ext with + | Some (Ext_code_annot (Ext_here | Ext_next_stmt | Ext_next_both)) -> + Logic_ptree.AExtended(bhvs,false,(ext,$2)) + | Some (Ext_code_annot Ext_next_loop) -> + raise + (Not_well_formed + (lexeme_loc 1, + ext ^ " is not a loop annotation extension. It can't be used as \ + plain code annotation extension")) + | Some (Ext_contract | Ext_global) | None -> + Kernel.fatal ~source:(lexeme_start 1) + "%s is not a code annotation extension. Parser got wrong lexeme" ext + } ; slice_pragma: @@ -1822,8 +1833,10 @@ is_acsl_spec: ; is_acsl_decl_or_code_annot: -| ASSERT { "assert" } +| EXT_CODE_ANNOT { $1 } +| EXT_GLOBAL { $1 } | ASSUMES { "assumes" } +| ASSERT { "assert" } | GLOBAL { "global" } | IMPACT { "impact" } | INDUCTIVE { "inductive" } @@ -1861,6 +1874,7 @@ is_ext_spec: keyword: | LOGIC { "logic" } | non_logic_keyword { $1 } +; non_logic_keyword: | c_keyword { $1 } @@ -1969,8 +1983,6 @@ wildcard: | STRING_LITERAL { () } | TILDE { () } | IN { () } -| EXT_GLOBAL { () } -| EXT_CODE_ANNOT { () } ; any: -- GitLab