summaryrefslogtreecommitdiffstats
path: root/parsing
diff options
context:
space:
mode:
Diffstat (limited to 'parsing')
-rw-r--r--parsing/asttypes.mli3
-rw-r--r--parsing/lexer.mll16
-rw-r--r--parsing/parser.mly17
-rw-r--r--parsing/printast.ml6
4 files changed, 37 insertions, 5 deletions
diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli
index 5aa9603a2..f9824d059 100644
--- a/parsing/asttypes.mli
+++ b/parsing/asttypes.mli
@@ -19,6 +19,9 @@ type constant =
| Const_char of char
| Const_string of string
| Const_float of string
+ | Const_int32 of int32
+ | Const_int64 of int64
+ | Const_nativeint of nativeint
type rec_flag = Nonrecursive | Recursive | Default
diff --git a/parsing/lexer.mll b/parsing/lexer.mll
index 6eb9a209c..1ac5a5f1d 100644
--- a/parsing/lexer.mll
+++ b/parsing/lexer.mll
@@ -231,6 +231,8 @@ let oct_literal =
'0' ['o' 'O'] ['0'-'7'] ['0'-'7' '_']*
let bin_literal =
'0' ['b' 'B'] ['0'-'1'] ['0'-'1' '_']*
+let int_literal =
+ decimal_literal | hex_literal | oct_literal | bin_literal
let float_literal =
['0'-'9'] ['0'-'9' '_']*
('.' ['0'-'9' '_']* )?
@@ -268,10 +270,20 @@ rule token = parse
LIDENT s }
| uppercase identchar *
{ UIDENT(Lexing.lexeme lexbuf) } (* No capitalized keywords *)
- | decimal_literal | hex_literal | oct_literal | bin_literal
+ | int_literal
{ INT (int_of_string(Lexing.lexeme lexbuf)) }
| float_literal
- { FLOAT (remove_underscores (Lexing.lexeme lexbuf)) }
+ { FLOAT (remove_underscores(Lexing.lexeme lexbuf)) }
+ | int_literal "l"
+ { let s = Lexing.lexeme lexbuf in
+ INT32 (Int32.of_string(String.sub s 0 (String.length s - 1))) }
+ | int_literal "L"
+ { let s = Lexing.lexeme lexbuf in
+ INT64 (Int64.of_string(String.sub s 0 (String.length s - 1))) }
+ | int_literal "n"
+ { let s = Lexing.lexeme lexbuf in
+ NATIVEINT
+ (Nativeint.of_string(String.sub s 0 (String.length s - 1))) }
| "\""
{ reset_string_buffer();
let string_start = lexbuf.lex_start_p in
diff --git a/parsing/parser.mly b/parsing/parser.mly
index eaac02c0b..5f809a6a8 100644
--- a/parsing/parser.mly
+++ b/parsing/parser.mly
@@ -87,6 +87,12 @@ let mkuminus name arg =
match name, arg.pexp_desc with
| "-", Pexp_constant(Const_int n) ->
mkexp(Pexp_constant(Const_int(-n)))
+ | "-", Pexp_constant(Const_int32 n) ->
+ mkexp(Pexp_constant(Const_int32(Int32.neg n)))
+ | "-", Pexp_constant(Const_int64 n) ->
+ mkexp(Pexp_constant(Const_int64(Int64.neg n)))
+ | "-", Pexp_constant(Const_nativeint n) ->
+ mkexp(Pexp_constant(Const_nativeint(Nativeint.neg n)))
| _, Pexp_constant(Const_float f) ->
mkexp(Pexp_constant(Const_float(neg_float_string f)))
| _ ->
@@ -234,6 +240,8 @@ let mktype_kind vflag kind =
%token INHERIT
%token INITIALIZER
%token <int> INT
+%token <int32> INT32
+%token <int64> INT64
%token <string> LABEL
%token LAZY
%token LBRACE
@@ -253,6 +261,7 @@ let mktype_kind vflag kind =
%token MINUSGREATER
%token MODULE
%token MUTABLE
+%token <nativeint> NATIVEINT
%token NEW
%token OBJECT
%token OF
@@ -1365,11 +1374,17 @@ constant:
| CHAR { Const_char $1 }
| STRING { Const_string $1 }
| FLOAT { Const_float $1 }
+ | INT32 { Const_int32 $1 }
+ | INT64 { Const_int64 $1 }
+ | NATIVEINT { Const_nativeint $1 }
;
signed_constant:
constant { $1 }
| MINUS INT { Const_int(- $2) }
- | subtractive FLOAT { Const_float("-" ^ $2) }
+ | MINUS FLOAT { Const_float("-" ^ $2) }
+ | MINUS INT32 { Const_int32(Int32.neg $2) }
+ | MINUS INT64 { Const_int64(Int64.neg $2) }
+ | MINUS NATIVEINT { Const_nativeint(Nativeint.neg $2) }
;
/* Identifiers and long identifiers */
diff --git a/parsing/printast.ml b/parsing/printast.ml
index f41193586..a44c61efe 100644
--- a/parsing/printast.ml
+++ b/parsing/printast.ml
@@ -46,9 +46,11 @@ let fmt_constant f x =
match x with
| Const_int (i) -> fprintf f "Const_int %d" i;
| Const_char (c) -> fprintf f "Const_char %02x" (Char.code c);
- | Const_string (s) ->
- fprintf f "Const_string %S" s;
+ | Const_string (s) -> fprintf f "Const_string %S" s;
| Const_float (s) -> fprintf f "Const_float %s" s;
+ | Const_int32 (i) -> fprintf f "Const_int32 %ld" i;
+ | Const_int64 (i) -> fprintf f "Const_int64 %Ld" i;
+ | Const_nativeint (i) -> fprintf f "Const_nativeint %nd" i;
;;
let fmt_mutable_flag f x =