811: code_spec: 812: | STRING { `StrTemplate (snd $1) } 813: | CSTRING { `Str (snd $1) } 814: 815: requirement: 816: | qualified_name 817: { 818: `Named_req (qualified_name_of_expr $1) 819: } 820: 821: | BODY code_spec { `Body_req $2 } 822: | HEADER code_spec { `Header_req $2 } 823: | PROPERTY STRING { `Property_req (snd $2) } 824: | PACKAGE code_spec { `Package_req $2 } 825: 826: requirement_atom: 827: | requirement { `RREQ_atom $1 } 828: | LPAR requirements RPAR { $2 } 829: 830: requirement_and: 831: | requirement_and AND requirement_atom { `RREQ_and ($1,$3) } 832: | requirement_atom { $1 } 833: 834: requirement_or: 835: | requirement_or OR requirement_and { `RREQ_or ($1,$3) } 836: | requirement_and { $1 } 837: 838: requirements: 839: | requirements COMMA requirement_or { `RREQ_and ($1,$3) } 840: | requirement_or { $1 } 841: 842: requires_clause: 843: | REQUIRES requirements { $2 } 844: | { `RREQ_true } 845: 846: binding_header: 847: | HEADER code_spec requires_clause SEMI 848: { 849: let sr = rstoken $1 $4 in 850: `AST_insert (sr, "_root", [], $2, `Header ,$3) 851: } 852: 853: | BODY code_spec requires_clause SEMI 854: { 855: let sr = rstoken $1 $4 in 856: `AST_insert (sr, "_root", [], $2, `Body, $3) 857: } 858: 859: | HEADER EQUAL code_spec requires_clause SEMI 860: { 861: let sr = rstoken $1 $5 in 862: `AST_insert (sr, "_root", [], $3, `Header, $4) 863: } 864: 865: | BODY EQUAL code_spec requires_clause SEMI 866: { 867: let sr = rstoken $1 $5 in 868: `AST_insert (sr, "_root", [], $3, `Body, $4) 869: } 870: 871: | HEADER NAME tvarlist EQUAL code_spec requires_clause SEMI 872: { 873: `AST_insert (rstoken $1 $7, snd $2, $3, $5, `Header, $6) 874: } 875: 876: | BODY NAME tvarlist EQUAL code_spec requires_clause SEMI 877: { 878: `AST_insert (rstoken $1 $7, snd $2, $3, $5, `Body, $6) 879: } 880: 881: | REQUIRES requirements SEMI 882: { 883: let sr = rstoken $1 $3 in 884: `AST_insert (sr, "_root", [], `Str "", `Body, $2) 885: } 886: 887: | NAME REQUIRES requirements SEMI 888: { 889: let sr = rstoken (fst $1) $4 in 890: `AST_insert (sr, snd $1, [], `Str "", `Body, $3) 891: } 892: