diff options
Diffstat (limited to 'parsing')
-rw-r--r-- | parsing/asttypes.mli | 3 | ||||
-rw-r--r-- | parsing/lexer.mll | 16 | ||||
-rw-r--r-- | parsing/parser.mly | 17 | ||||
-rw-r--r-- | parsing/printast.ml | 6 |
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 = |