Skip to content

Commit f0c945a

Browse files
authored
Merge pull request #31 from ddeclerck/numeric_typing
More USAGE typing
2 parents 3f5f0ea + 22f1423 commit f0c945a

File tree

3 files changed

+27
-7
lines changed

3 files changed

+27
-7
lines changed

src/lsp/cobol_ast/data_descr.ml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,8 +382,8 @@ type usage_clause =
382382
| Pointer of name with_loc option (* +COB2002 *)
383383
| FunctionPointer of name with_loc (* +COB2002 *)
384384
| ProgramPointer of name with_loc option (* +COB2002 *)
385-
| UsagePending of [`Comp0 | `Comp1 | `Comp5 | `Comp6 | `CompX |
386-
`CompN | `Comp9 | `Comp10 | `Comp15 ]
385+
| UsagePending of [`Comp0 | `Comp1 | `Comp2 | `Comp3 | `Comp5 | `Comp6 |
386+
`CompX | `CompN | `Comp9 | `Comp10 | `Comp15 ]
387387
[@@deriving ord]
388388

389389
and signedness =
@@ -493,6 +493,8 @@ let pp_usage_clause ppf usage =
493493
match comp with
494494
| `Comp0 -> Fmt.pf ppf "COMP-0"
495495
| `Comp1 -> Fmt.pf ppf "COMP-1"
496+
| `Comp2 -> Fmt.pf ppf "COMP-2"
497+
| `Comp3 -> Fmt.pf ppf "COMP-3"
496498
| `Comp5 -> Fmt.pf ppf "COMP-5"
497499
| `Comp6 -> Fmt.pf ppf "COMP-6"
498500
| `CompX -> Fmt.pf ppf "COMP-X"
@@ -903,4 +905,4 @@ let pp_comm_clause ppf = function
903905
| CommTextLength n -> Fmt.pf ppf "TEXT LENGTH IS %a" pp_name' n
904906
| CommStatusKey n -> Fmt.pf ppf "STATUS KEY IS %a" pp_name' n
905907
| CommEndKey n -> Fmt.pf ppf "END KEY IS %a" pp_name' n
906-
| CommErrorKey n -> Fmt.pf ppf "ERROR KEY IS %a" pp_name' n
908+
| CommErrorKey n -> Fmt.pf ppf "ERROR KEY IS %a" pp_name' n

src/lsp/cobol_data/typing.ml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,34 @@ let rec of_data_group
6060
(* Result.ok @@ Elementary (({typ = Types.Pointer (\* L8 *\); level}, None) &@ loc) *)
6161
| ObjectReference _ ->
6262
Ok (Elementary ({typ = Types.Object; level}, None) &@ loc)
63+
| BinaryChar _
64+
| BinaryShort _
65+
| BinaryLong _
66+
| BinaryDouble _
67+
| FloatBinary32 _
68+
| FloatBinary64 _
69+
| FloatBinary128 _
70+
| FloatDecimal16 _
71+
| FloatDecimal34 _
72+
| FloatShort
73+
| FloatLong
74+
| FloatExtended ->
75+
(* As per ISO/IEC 1989:2014, 8.5.2.10 Numeric category *)
76+
Ok (Elementary ({typ = Numeric; level}, None) &@ loc)
77+
| UsagePending (`Comp1 | `Comp2) ->
78+
Ok (Elementary ({typ = Numeric; level}, None) &@ loc)
6379
| _ ->
6480
Diags.error ~loc "Missing@ PICTURE@ clause";
6581
Result.Error ()
6682
end
6783
| Some picture, Some usage ->
6884
let cobol_class = cobol_class_of_picture ~&picture in
6985
begin match usage, cobol_class with
70-
| (Binary | PackedDecimal), Numeric ->
86+
| (Binary | PackedDecimal |
87+
UsagePending (`Comp3 | `Comp5 | `Comp6 | `CompX)), Numeric ->
7188
Ok (Elementary ({ typ = cobol_class; level }, Some ~&picture) &@ loc)
72-
| (Binary | PackedDecimal), _ ->
89+
| (Binary | PackedDecimal |
90+
UsagePending (`Comp3 | `Comp5 | `Comp6 | `CompX)), _ ->
7391
Diags.error ~loc
7492
"The picture associated with a USAGE clause of type BINARY \
7593
(COMP) or PACKED-DECIMAL must be a numeric picture";

src/lsp/cobol_parser/grammar.mly

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,8 +1561,8 @@ usage [@context usage_clause (* ok as none of leftmost terminals are C/S *)]:
15611561
| COMP { Binary }
15621562
| COMP_0 { UsagePending `Comp0 }
15631563
| COMP_1 { UsagePending `Comp1 }
1564-
| COMP_2 { FloatLong }
1565-
| COMP_3 { PackedDecimal }
1564+
| COMP_2 { UsagePending `Comp2 }
1565+
| COMP_3 { UsagePending `Comp3 }
15661566
| COMP_4 { Binary }
15671567
| COMP_5 { UsagePending `Comp5 }
15681568
| COMP_6 { UsagePending `Comp6 }

0 commit comments

Comments
 (0)