|
130 | 130 | head(range::TaggedRange) = range.head
|
131 | 131 | kind(range::TaggedRange) = kind(range.head)
|
132 | 132 | flags(range::TaggedRange) = flags(range.head)
|
133 |
| -first_byte(range::TaggedRange) = range.first_byte |
134 |
| -last_byte(range::TaggedRange) = range.last_byte |
| 133 | +first_byte(range::TaggedRange) = Int(range.first_byte) |
| 134 | +last_byte(range::TaggedRange) = Int(range.last_byte) |
135 | 135 | span(range::TaggedRange) = 1 + last_byte(range) - first_byte(range)
|
136 | 136 |
|
137 | 137 | #-------------------------------------------------------------------------------
|
@@ -492,16 +492,42 @@ the kind or flags of a token in a way which would require unbounded lookahead
|
492 | 492 | in a recursive descent parser. Modifying the output with reset_node! is useful
|
493 | 493 | in those cases.
|
494 | 494 | """
|
495 |
| -function reset_node!(stream::ParseStream, mark::ParseStreamPosition; |
| 495 | +function reset_node!(stream::ParseStream, pos::ParseStreamPosition; |
496 | 496 | kind=nothing, flags=nothing)
|
497 |
| - range = stream.ranges[mark.output_index] |
| 497 | + range = stream.ranges[pos.output_index] |
498 | 498 | k = isnothing(kind) ? (@__MODULE__).kind(range) : kind
|
499 | 499 | f = isnothing(flags) ? (@__MODULE__).flags(range) : flags
|
500 |
| - stream.ranges[mark.output_index] = |
| 500 | + stream.ranges[pos.output_index] = |
501 | 501 | TaggedRange(SyntaxHead(k, f), range.orig_kind,
|
502 | 502 | first_byte(range), last_byte(range), range.start_mark)
|
503 | 503 | end
|
504 | 504 |
|
| 505 | +""" |
| 506 | +Move `numbytes` from the range at output position `pos+1` to the output |
| 507 | +position `pos`. If the donor range becomes empty, mark it dead with |
| 508 | +K"TOMBSTONE" and return `true`, otherwise return `false`. |
| 509 | +
|
| 510 | +Hack alert! This is used only for managing the complicated rules related to |
| 511 | +dedenting triple quoted strings. |
| 512 | +""" |
| 513 | +function steal_node_bytes!(stream::ParseStream, pos::ParseStreamPosition, numbytes) |
| 514 | + i = pos.output_index |
| 515 | + r1 = stream.ranges[i] |
| 516 | + r2 = stream.ranges[i+1] |
| 517 | + @assert span(r1) == 0 |
| 518 | + @assert numbytes <= span(r2) |
| 519 | + fb2 = r2.first_byte + numbytes |
| 520 | + rhs_empty = fb2 > last_byte(r2) |
| 521 | + head2 = rhs_empty ? SyntaxHead(K"TOMBSTONE", EMPTY_FLAGS) : r2.head |
| 522 | + stream.ranges[i] = TaggedRange(r1.head, r1.orig_kind, |
| 523 | + r2.first_byte, fb2 - 1, |
| 524 | + r1.start_mark) |
| 525 | + stream.ranges[i+1] = TaggedRange(head2, r2.orig_kind, |
| 526 | + fb2, r2.last_byte, |
| 527 | + r2.start_mark) |
| 528 | + return rhs_empty |
| 529 | +end |
| 530 | + |
505 | 531 | function Base.position(stream::ParseStream)
|
506 | 532 | ParseStreamPosition(stream.next_byte, lastindex(stream.ranges))
|
507 | 533 | end
|
|
0 commit comments