999: code_spec: 1000: | STRING { `StrTemplate (snd $1) } 1001: | CSTRING { `Str (snd $1) } 1002: | IDENT { `Identity } 1003: 1004: requirement: 1005: | qualified_name 1006: { 1007: `Named_req (qualified_name_of_expr $1) 1008: } 1009: 1010: | BODY code_spec { `Body_req $2 } 1011: | HEADER code_spec { `Header_req $2 } 1012: | PROPERTY STRING { `Property_req (snd $2) } 1013: | PACKAGE code_spec { `Package_req $2 } 1014: 1015: requirement_atom: 1016: | requirement { `RREQ_atom $1 } 1017: | LPAR requirements RPAR { $2 } 1018: 1019: requirement_and: 1020: | requirement_and AND requirement_atom { `RREQ_and ($1,$3) } 1021: | requirement_atom { $1 } 1022: 1023: requirement_or: 1024: | requirement_or OR requirement_and { `RREQ_or ($1,$3) } 1025: | requirement_and { $1 } 1026: 1027: requirements: 1028: | requirements COMMA requirement_or { `RREQ_and ($1,$3) } 1029: | requirement_or { $1 } 1030: 1031: requires_clause: 1032: | REQUIRES requirements { $2 } 1033: | { `RREQ_true } 1034: 1035: binding_header: 1036: | HEADER code_spec requires_clause SEMI 1037: { 1038: let sr = rstoken $1 $4 in 1039: `AST_insert (sr, "_root", dfltvs, $2, `Header ,$3) 1040: } 1041: 1042: | BODY code_spec requires_clause SEMI 1043: { 1044: let sr = rstoken $1 $4 in 1045: `AST_insert (sr, "_root", dfltvs, $2, `Body, $3) 1046: } 1047: 1048: | HEADER EQUAL code_spec requires_clause SEMI 1049: { 1050: let sr = rstoken $1 $5 in 1051: `AST_insert (sr, "_root", dfltvs, $3, `Header, $4) 1052: } 1053: 1054: | BODY EQUAL code_spec requires_clause SEMI 1055: { 1056: let sr = rstoken $1 $5 in 1057: `AST_insert (sr, "_root", dfltvs, $3, `Body, $4) 1058: } 1059: 1060: | HEADER declname EQUAL code_spec requires_clause SEMI 1061: { 1062: let name,vs = hd $2 in 1063: let sr = rstoken $1 $6 in 1064: let stmt = `AST_insert (sr,name,vs, $4, `Header, $5) in 1065: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 1066: } 1067: 1068: | BODY declname EQUAL code_spec requires_clause SEMI 1069: { 1070: let name,vs = hd $2 in 1071: let sr = rstoken $1 $6 in 1072: let stmt = `AST_insert (sr,name,vs, $4, `Body, $5) in 1073: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 1074: } 1075: 1076: | REQUIRES requirements SEMI 1077: { 1078: let sr = rstoken $1 $3 in 1079: `AST_insert (sr, "_root", dfltvs, `Str "", `Body, $2) 1080: } 1081: 1082: | NAME REQUIRES requirements SEMI 1083: { 1084: let sr = rstoken (fst $1) $4 in 1085: `AST_insert (sr, snd $1, dfltvs, `Str "", `Body, $3) 1086: } 1087: