@@ -112,10 +112,14 @@ module Offside = struct
112112 if column < indent - 2 then error " offside" else
113113 emit token >>
114114 get >> = inside_braces break false indent
115+ | AND ->
116+ if column < indent then error " offside" else
117+ emit token >>
118+ get >> = inside_braces break false indent
115119 | _ ->
116120 if column < indent then error " offside" else
117121 emit_if (column = indent && insert) COMMA >>
118- nest (token, column) >>
122+ nest false (token, column) >>
119123 get >> = inside_braces break (token <> LOCAL ) indent
120124
121125 and inside_local insert indent (token , column ) =
@@ -132,7 +136,7 @@ module Offside = struct
132136 emit IN
133137 else
134138 emit_if (column = indent && insert) COMMA >>
135- nest (token, column) >>
139+ nest false (token, column) >>
136140 get >> = inside_local (token <> LOCAL ) indent
137141
138142 and inside_let insert indent (token , column ) =
@@ -151,12 +155,13 @@ module Offside = struct
151155 inside_in false column (token, column)
152156 else
153157 emit_if (column = indent && insert) COMMA >>
154- nest (token, column) >>
158+ nest false (token, column) >>
155159 get >> = inside_let (token <> LOCAL ) indent
156160
157161 and inside_in insert indent (token , column ) =
158162 match token with
159- | RBRACE | COMMA | IN | EOF | RPAR | ELSE | THEN -> unget (token, column)
163+ | RBRACE | COMMA | IN | EOF | RPAR | ELSE | THEN | EQUAL ->
164+ unget (token, column)
160165 | SEMI ->
161166 if column < indent - 2 then error " offside" else
162167 emit token >>
@@ -170,7 +175,7 @@ module Offside = struct
170175 let slack = slack_of token in
171176 if column < indent - slack then unget (token, column) else
172177 emit_if (slack = 0 && column = indent && insert) SEMI >>
173- nest (token, column) >>
178+ nest true (token, column) >>
174179 get >> = inside_in (slack = 0 && indent < = column) indent
175180
176181 and inside_parens indent (token , column ) =
@@ -180,7 +185,7 @@ module Offside = struct
180185 emit token >>
181186 get >> = inside_parens indent
182187 | _ ->
183- nest (token, column) >>
188+ nest true (token, column) >>
184189 get >> = inside_in false indent >>
185190 get >> = inside_parens indent
186191
@@ -203,8 +208,8 @@ module Offside = struct
203208 emit ELSE >> emit LBRACE >> emit RBRACE >>
204209 unget (token, column)
205210
206- and nest (token , column ) =
207- (match token with FUN | REC | IF -> emit LPAR | _ -> unit ) >>
211+ and nest is_expr (token , column ) =
212+ (match token with ( FUN | REC | IF ) when is_expr -> emit LPAR | _ -> unit ) >>
208213 emit token >>
209214 match token with
210215 | LBRACE ->
@@ -220,9 +225,11 @@ module Offside = struct
220225 | DARROW ->
221226 get >> = fun (token , column ) ->
222227 inside_in false column (token, column) >>
223- emit RPAR
228+ if is_expr then emit RPAR else unit
224229 | EQUAL | DO ->
225230 get >> = fun (token , column ) -> inside_in false column (token, column)
231+ | TYPE_ERROR ->
232+ get >> = fun (token , column ) -> inside_in false column (token, column)
226233 | IF ->
227234 inside_if column >>
228235 emit RPAR
@@ -277,6 +284,7 @@ rule token = parse
277284 | " import" { IMPORT }
278285 | " primitive" { PRIMITIVE }
279286 | " rec" { REC }
287+ | " and" { AND }
280288 | " then" { THEN }
281289 | " type" { TYPE }
282290 | " with" { WITH }
0 commit comments