@@ -92,8 +92,10 @@ use alloc::{vec, vec::Vec};
92
92
struct Sequence {
93
93
/// Marker as a byte (`u8`) used in this sequence.
94
94
marker : u8 ,
95
- /// The depth in events where this sequence resides.
96
- balance : usize ,
95
+ /// We track whether sequences are in balanced events, and where those
96
+ /// events start, so that one attention doesn’t start in say, one link, and
97
+ /// end in another.
98
+ stack : Vec < usize > ,
97
99
/// The index into events where this sequence’s `Enter` currently resides.
98
100
index : usize ,
99
101
/// The (shifted) point where this sequence starts.
@@ -172,7 +174,7 @@ pub fn resolve(tokenizer: &mut Tokenizer) -> Option<Subresult> {
172
174
// An opener matching our closer:
173
175
if sequence_open. open
174
176
&& sequence_close. marker == sequence_open. marker
175
- && sequence_close. balance == sequence_open. balance
177
+ && sequence_close. stack == sequence_open. stack
176
178
{
177
179
// If the opening can close or the closing can open,
178
180
// and the close size *is not* a multiple of three,
@@ -219,23 +221,20 @@ pub fn resolve(tokenizer: &mut Tokenizer) -> Option<Subresult> {
219
221
}
220
222
221
223
tokenizer. map . consume ( & mut tokenizer. events ) ;
222
-
223
224
None
224
225
}
225
226
226
227
/// Get sequences.
227
228
fn get_sequences ( tokenizer : & mut Tokenizer ) -> Vec < Sequence > {
228
229
let mut index = 0 ;
229
- let mut balance = 0 ;
230
+ let mut stack = vec ! [ ] ;
230
231
let mut sequences = vec ! [ ] ;
231
232
232
233
while index < tokenizer. events . len ( ) {
233
234
let enter = & tokenizer. events [ index] ;
234
235
235
- if enter. kind == Kind :: Enter {
236
- balance += 1 ;
237
-
238
- if enter. name == Name :: AttentionSequence {
236
+ if enter. name == Name :: AttentionSequence {
237
+ if enter. kind == Kind :: Enter {
239
238
let end = index + 1 ;
240
239
let exit = & tokenizer. events [ end] ;
241
240
@@ -255,7 +254,7 @@ fn get_sequences(tokenizer: &mut Tokenizer) -> Vec<Sequence> {
255
254
256
255
sequences. push ( Sequence {
257
256
index,
258
- balance ,
257
+ stack : stack . clone ( ) ,
259
258
start_point : enter. point . clone ( ) ,
260
259
end_point : exit. point . clone ( ) ,
261
260
size : exit. point . index - enter. point . index ,
@@ -272,8 +271,10 @@ fn get_sequences(tokenizer: &mut Tokenizer) -> Vec<Sequence> {
272
271
marker,
273
272
} ) ;
274
273
}
274
+ } else if enter. kind == Kind :: Enter {
275
+ stack. push ( index) ;
275
276
} else {
276
- balance -= 1 ;
277
+ stack . pop ( ) ;
277
278
}
278
279
279
280
index += 1 ;
0 commit comments