@@ -159,6 +159,8 @@ type closer =
159
159
| BRACE
160
160
| QUOTE
161
161
162
+ exception Unexpected_eol
163
+
162
164
let read ~path filename =
163
165
164
166
let file = Filename. basename filename in
@@ -174,13 +176,13 @@ let read ~path filename =
174
176
Buffer. clear b;
175
177
if s = " " then [] else [ STRING s ]
176
178
in
177
- let parse_line ic line =
179
+ let parse_line_exn ic line =
178
180
let len = String. length line in
179
181
let b = Buffer. create len in
180
182
let rec iter i braced =
181
183
if i = len then
182
184
if braced <> EOL then
183
- INPUT. error ~ic " unexpected end of line "
185
+ raise Unexpected_eol
184
186
else
185
187
len,
186
188
maybe b
@@ -272,6 +274,13 @@ let read ~path filename =
272
274
INPUT. error ~ic " unbalanced ending brace" ;
273
275
line
274
276
in
277
+ let parse_line ic arg =
278
+ try
279
+ parse_line_exn ic arg
280
+ with
281
+ | Unexpected_eol ->
282
+ INPUT. error ~ic " unexpected end of line"
283
+ in
275
284
let parse_level ic arg =
276
285
let len = String. length arg in
277
286
if len < 3 ||
@@ -498,8 +507,21 @@ let read ~path filename =
498
507
if line = " " then
499
508
iter_lines ic ( EMPTY_LINE :: rev ) stack
500
509
else
501
- let line = parse_line ic line in
502
- iter_lines ic ( LINE line :: rev ) stack
510
+ parse_line_rec true ic line rev stack
511
+
512
+ and parse_line_rec again ic line rev stack =
513
+ match parse_line_exn ic line with
514
+ | line -> iter_lines ic ( LINE line :: rev ) stack
515
+ | exception Unexpected_eol ->
516
+ if again then
517
+ match INPUT. input_line ic with
518
+ | exception _ ->
519
+ INPUT. close_in ic;
520
+ rev, stack
521
+ | line2 ->
522
+ parse_line_rec false ic (line ^ " \n " ^ line2) rev stack
523
+ else
524
+ INPUT. error ~ic " unexpected end of line after continuation"
503
525
504
526
and end_item ic rev stack item_arg =
505
527
match stack with
0 commit comments