5 /// Output of the parser -- a DFS traversal of a concrete syntax tree.
7 /// Use the [`Output::iter`] method to iterate over traversal steps and consume
10 /// In a sense, this is just a sequence of [`SyntaxKind`]-colored parenthesis
11 /// interspersed into the original [`crate::Input`]. The output is fundamentally
12 /// coordinated with the input and `n_input_tokens` refers to the number of
13 /// times [`crate::Input::push`] was called.
16 /// 32-bit encoding of events. If LSB is zero, then that's an index into the
17 /// error vector. Otherwise, it's one of the thee other variants, with data encoded as
19 /// |16 bit kind|8 bit n_input_tokens|4 bit tag|4 bit leftover|
27 Token { kind: SyntaxKind, n_input_tokens: u8 }
,
28 Enter { kind: SyntaxKind }
,
30 Error { msg: &'a str }
,
34 pub fn iter(&self) -> impl Iterator
<Item
= Step
<'_
>> {
35 self.event
.iter().map(|&event
| {
37 return Step
::Error { msg: self.error[(event as usize) >> 1].as_str() }
;
39 let tag
= ((event
& 0x0000_00F0) >> 4) as u8;
42 let kind
: SyntaxKind
= (((event
& 0xFFFF_0000) >> 16) as u16).into();
43 let n_input_tokens
= ((event
& 0x0000_FF00) >> 8) as u8;
44 Step
::Token { kind, n_input_tokens }
47 let kind
: SyntaxKind
= (((event
& 0xFFFF_0000) >> 16) as u16).into();
56 pub(crate) fn token(&mut self, kind
: SyntaxKind
, n_tokens
: u8) {
57 let e
= ((kind
as u16 as u32) << 16) | ((n_tokens
as u32) << 8) | 1;
61 pub(crate) fn enter_node(&mut self, kind
: SyntaxKind
) {
62 let e
= ((kind
as u16 as u32) << 16) | (1 << 4) | 1;
66 pub(crate) fn leave_node(&mut self) {
71 pub(crate) fn error(&mut self, error
: String
) {
72 let idx
= self.error
.len();
73 self.error
.push(error
);
74 let e
= (idx
as u32) << 1;