Skip to content

Commit e34dc32

Browse files
committed
Allow Infix constructors of the form ::..
1 parent 49d3f7b commit e34dc32

2 files changed

Lines changed: 26 additions & 23 deletions

File tree

parsing/lexer.mll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,10 @@ let lowercase_latin1 = ['a'-'z' '\223'-'\246' '\248'-'\255' '_']
268268
let uppercase_latin1 = ['A'-'Z' '\192'-'\214' '\216'-'\222']
269269
let identchar_latin1 =
270270
['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9']
271+
let constructorchar =
272+
['$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '@' '^' '|']
271273
let symbolchar =
272-
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~']
274+
constructorchar | ['!' '?' '~']
273275
let decimal_literal =
274276
['0'-'9'] ['0'-'9' '_']*
275277
let hex_literal =
@@ -433,7 +435,6 @@ rule token = parse
433435
| "." { DOT }
434436
| ".." { DOTDOT }
435437
| ":" { COLON }
436-
| "::" { COLONCOLON }
437438
| ":=" { COLONEQUAL }
438439
| ":>" { COLONGREATER }
439440
| ";" { SEMI }
@@ -483,6 +484,8 @@ rule token = parse
483484
| '%' { PERCENT }
484485
| ['*' '/' '%'] symbolchar *
485486
{ INFIXOP3(Lexing.lexeme lexbuf) }
487+
| "::" constructorchar *
488+
{ INFIXCONSTRUCTOR(Lexing.lexeme lexbuf) }
486489
| eof { EOF }
487490
| _
488491
{ raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0),

parsing/parser.mly

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ let mkuplus name arg =
106106
| _ ->
107107
mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg]))
108108

109-
let mkexp_cons consloc args loc =
110-
Exp.mk ~loc (Pexp_construct(mkloc (Lident "::") consloc, Some args))
109+
let mkexp_constructor constructor constructorloc args loc =
110+
Exp.mk ~loc (Pexp_construct(mkloc (Lident constructor) constructorloc, Some args))
111111

112-
let mkpat_cons consloc args loc =
113-
Pat.mk ~loc (Ppat_construct(mkloc (Lident "::") consloc, Some args))
112+
let mkpat_constructor constructor constructorloc args loc =
113+
Pat.mk ~loc (Ppat_construct(mkloc (Lident constructor) constructorloc, Some args))
114114

115115
let rec mktailexp nilloc = function
116116
[] ->
@@ -124,7 +124,7 @@ let rec mktailexp nilloc = function
124124
loc_ghost = true}
125125
in
126126
let arg = Exp.mk ~loc (Pexp_tuple [e1; exp_el]) in
127-
mkexp_cons {loc with loc_ghost = true} arg loc
127+
mkexp_constructor "::" {loc with loc_ghost = true} arg loc
128128

129129
let rec mktailpat nilloc = function
130130
[] ->
@@ -138,7 +138,7 @@ let rec mktailpat nilloc = function
138138
loc_ghost = true}
139139
in
140140
let arg = Pat.mk ~loc (Ppat_tuple [p1; pat_pl]) in
141-
mkpat_cons {loc with loc_ghost = true} arg loc
141+
mkpat_constructor "::" {loc with loc_ghost = true} arg loc
142142

143143
let mkstrexp e attrs =
144144
{ pstr_desc = Pstr_eval (e, attrs); pstr_loc = e.pexp_loc }
@@ -307,7 +307,6 @@ let mkctf_attrs d attrs =
307307
%token <char> CHAR
308308
%token CLASS
309309
%token COLON
310-
%token COLONCOLON
311310
%token COLONEQUAL
312311
%token COLONGREATER
313312
%token COMMA
@@ -340,6 +339,7 @@ let mkctf_attrs d attrs =
340339
%token <string> INFIXOP2
341340
%token <string> INFIXOP3
342341
%token <string> INFIXOP4
342+
%token <string> INFIXCONSTRUCTOR
343343
%token INHERIT
344344
%token INITIALIZER
345345
%token <int> INT
@@ -461,13 +461,13 @@ The precedences must be listed from low to high.
461461
%nonassoc below_LBRACKETAT
462462
%nonassoc LBRACKETAT
463463
%nonassoc LBRACKETATAT
464-
%right COLONCOLON /* expr (e :: e :: e) */
464+
%right INFIXCONSTRUCTOR /* expr (e OP e OP e) with OP a constructor */
465465
%left INFIXOP2 PLUS PLUSDOT MINUS MINUSDOT PLUSEQ /* expr (e OP e OP e) */
466466
%left PERCENT INFIXOP3 STAR /* expr (e OP e OP e) */
467467
%right INFIXOP4 /* expr (e OP e OP e) */
468468
%nonassoc prec_unary_minus prec_unary_plus /* unary - */
469469
%nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */
470-
%nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */
470+
%nonassoc prec_constr_appl /* above AS BAR INFIXCONSTRUCTOR COMMA */
471471
%nonassoc below_SHARP
472472
%nonassoc SHARP /* simple_expr/toplevel_directive */
473473
%nonassoc below_DOT
@@ -1116,10 +1116,10 @@ expr:
11161116
| FOR ext_attributes pattern EQUAL seq_expr direction_flag seq_expr DO
11171117
seq_expr DONE
11181118
{ mkexp_attrs(Pexp_for($3, $5, $7, $6, $9)) $2 }
1119-
| expr COLONCOLON expr
1120-
{ mkexp_cons (rhs_loc 2) (ghexp(Pexp_tuple[$1;$3])) (symbol_rloc()) }
1121-
| LPAREN COLONCOLON RPAREN LPAREN expr COMMA expr RPAREN
1122-
{ mkexp_cons (rhs_loc 2) (ghexp(Pexp_tuple[$5;$7])) (symbol_rloc()) }
1119+
| expr INFIXCONSTRUCTOR expr
1120+
{ mkexp_constructor $2 (rhs_loc 2) (ghexp(Pexp_tuple[$1;$3])) (symbol_rloc()) }
1121+
| LPAREN INFIXCONSTRUCTOR RPAREN LPAREN expr COMMA expr RPAREN
1122+
{ mkexp_constructor $2 (rhs_loc 2) (ghexp(Pexp_tuple[$5;$7])) (symbol_rloc()) }
11231123
| expr INFIXOP0 expr
11241124
{ mkinfix $1 $2 $3 }
11251125
| expr INFIXOP1 expr
@@ -1433,13 +1433,13 @@ pattern:
14331433
{ mkpat(Ppat_construct(mkrhs $1 1, Some $2)) }
14341434
| name_tag pattern %prec prec_constr_appl
14351435
{ mkpat(Ppat_variant($1, Some $2)) }
1436-
| pattern COLONCOLON pattern
1437-
{ mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$1;$3])) (symbol_rloc()) }
1438-
| pattern COLONCOLON error
1436+
| pattern INFIXCONSTRUCTOR pattern
1437+
{ mkpat_constructor $2 (rhs_loc 2) (ghpat(Ppat_tuple[$1;$3])) (symbol_rloc()) }
1438+
| pattern INFIXCONSTRUCTOR error
14391439
{ expecting 3 "pattern" }
1440-
| LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern RPAREN
1441-
{ mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$5;$7])) (symbol_rloc()) }
1442-
| LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern error
1440+
| LPAREN INFIXCONSTRUCTOR RPAREN LPAREN pattern COMMA pattern RPAREN
1441+
{ mkpat_constructor $2 (rhs_loc 2) (ghpat(Ppat_tuple[$5;$7])) (symbol_rloc()) }
1442+
| LPAREN INFIXCONSTRUCTOR RPAREN LPAREN pattern COMMA pattern error
14431443
{ unclosed "(" 4 ")" 8 }
14441444
| pattern BAR pattern
14451445
{ mkpat(Ppat_or($1, $3)) }
@@ -1971,8 +1971,8 @@ constr_ident:
19711971
UIDENT { $1 }
19721972
/* | LBRACKET RBRACKET { "[]" } */
19731973
| LPAREN RPAREN { "()" }
1974-
| COLONCOLON { "::" }
1975-
/* | LPAREN COLONCOLON RPAREN { "::" } */
1974+
| INFIXCONSTRUCTOR { $1 }
1975+
/* | LPAREN INFIXCONSTRUCTOR RPAREN { $1 } */
19761976
| FALSE { "false" }
19771977
| TRUE { "true" }
19781978
;

0 commit comments

Comments
 (0)