@@ -4,8 +4,6 @@ pub(crate) mod lr_parse_state;
44pub ( crate ) use extra:: * ;
55pub ( crate ) use lr_parse_state:: * ;
66
7- use std:: collections:: HashSet ;
8-
97use cstree:: {
108 build:: GreenNodeBuilder , green:: GreenNode , interning:: Resolver , RawSyntaxKind , Syntax ,
119} ;
@@ -66,17 +64,24 @@ pub struct ParseError {
6664 pub end_byte_pos : usize ,
6765}
6866
67+ /// ノードがトークンを含むか否かを判定する
68+ /// トークンを含まないノードは削除し、ダミートークンを含む補完されたノードは残すために使用する
69+ fn contains_token ( node : & Node ) -> bool {
70+ if node. token . is_some ( ) {
71+ return true ;
72+ }
73+
74+ node. children . iter ( ) . any ( contains_token)
75+ }
76+
6977impl Parser {
7078 fn parse_rec (
7179 & mut self ,
7280 node : & Node ,
7381 peekable : & mut std:: iter:: Peekable < std:: vec:: IntoIter < Extra > > ,
74- complement_token : & HashSet < usize > ,
7582 ) {
7683 if cfg ! ( feature = "remove-empty-node" ) {
77- if node. start_byte_pos == node. end_byte_pos
78- && !complement_token. contains ( & node. start_byte_pos )
79- {
84+ if node. start_byte_pos == node. end_byte_pos && !contains_token ( node) {
8085 return ;
8186 }
8287 }
@@ -104,23 +109,18 @@ impl Parser {
104109 self . builder . start_node ( kind) ;
105110 node. children
106111 . iter ( )
107- . for_each ( |c| self . parse_rec ( c, peekable, complement_token ) ) ;
112+ . for_each ( |c| self . parse_rec ( c, peekable) ) ;
108113 self . builder . finish_node ( ) ;
109114 }
110115 }
111116
112- fn parse (
113- mut self ,
114- nodes : & Vec < & Node > ,
115- extras : Vec < Extra > ,
116- complement_token : & HashSet < usize > ,
117- ) -> ( GreenNode , impl Resolver ) {
117+ fn parse ( mut self , nodes : & Vec < & Node > , extras : Vec < Extra > ) -> ( GreenNode , impl Resolver ) {
118118 let mut peekable = extras. into_iter ( ) . peekable ( ) ;
119119
120120 self . builder . start_node ( SyntaxKind :: Root ) ;
121121
122122 for node in nodes {
123- self . parse_rec ( node, & mut peekable, complement_token ) ;
123+ self . parse_rec ( node, & mut peekable) ;
124124 }
125125
126126 while let Some ( Extra { kind, comment, .. } ) = peekable. peek ( ) {
@@ -235,8 +235,43 @@ pub fn parse_with_transformer(
235235 let action_table = unsafe { action_table_u8. align_to :: < i16 > ( ) . 1 } ;
236236 let goto_table = unsafe { goto_table_u8. align_to :: < i16 > ( ) . 1 } ;
237237
238+ struct TokenQueue {
239+ tokens : std:: iter:: Peekable < std:: vec:: IntoIter < Token > > ,
240+ dummy_token : Option < Token > ,
241+ }
242+
243+ impl TokenQueue {
244+ fn new ( tokens : Vec < Token > ) -> Self {
245+ Self {
246+ tokens : tokens. into_iter ( ) . peekable ( ) ,
247+ dummy_token : None ,
248+ }
249+ }
250+
251+ fn next ( & mut self ) -> Option < Token > {
252+ if self . dummy_token . is_some ( ) {
253+ let dummy_token = self . dummy_token . take ( ) ;
254+ dummy_token
255+ } else {
256+ self . tokens . next ( )
257+ }
258+ }
259+
260+ fn peek ( & mut self ) -> Option < & Token > {
261+ self . dummy_token . as_ref ( ) . or_else ( || self . tokens . peek ( ) )
262+ }
263+
264+ fn insert_dummy_token ( & mut self , token : Token ) {
265+ if self . dummy_token . is_some ( ) {
266+ panic ! ( ) ;
267+ }
268+
269+ self . dummy_token = Some ( token) ;
270+ }
271+ }
272+
238273 let mut stack: Vec < ( u32 , Node ) > = Vec :: new ( ) ;
239- let mut tokens: std :: iter :: Peekable < std :: vec :: IntoIter < Token > > = tokens . into_iter ( ) . peekable ( ) ;
274+ let mut tokens = TokenQueue :: new ( tokens ) ;
240275
241276 stack. push ( (
242277 0 ,
@@ -251,7 +286,6 @@ pub fn parse_with_transformer(
251286
252287 let mut last_pos = 0 ;
253288 let mut extras: Vec < Extra > = Vec :: new ( ) ;
254- let mut complement_token = HashSet :: new ( ) ;
255289
256290 loop {
257291 let state = stack. last ( ) . unwrap ( ) . 0 ;
@@ -292,7 +326,6 @@ pub fn parse_with_transformer(
292326 continue ;
293327 }
294328
295- let mut insert_dummy_token = false ;
296329 let mut action = match action_table[ ( state * num_terminal_symbol ( ) + cid) as usize ] {
297330 0x7FFF => Action :: Error ,
298331 v if v > 0 => Action :: Shift ( ( v - 1 ) as usize ) ,
@@ -301,7 +334,7 @@ pub fn parse_with_transformer(
301334 } ;
302335
303336 // transform
304- {
337+ if action == Action :: Error {
305338 let lr_parse_state = LRParseState {
306339 state,
307340 stack : & stack,
@@ -326,7 +359,6 @@ pub fn parse_with_transformer(
326359 kind : token_kind,
327360 value : String :: new ( ) ,
328361 } ;
329- complement_token. insert ( token. start_byte_pos ) ;
330362
331363 action = match action_table[ ( state * num_terminal_symbol ( ) + cid) as usize ]
332364 {
@@ -335,7 +367,7 @@ pub fn parse_with_transformer(
335367 v if v < 0 => Action :: Reduce ( ( -v - 1 ) as usize ) ,
336368 _ => Action :: Accept ,
337369 } ;
338- insert_dummy_token = true ;
370+ tokens . insert_dummy_token ( token . clone ( ) ) ;
339371 }
340372
341373 ParseTransform :: SkipToken => {
@@ -387,9 +419,7 @@ pub fn parse_with_transformer(
387419 last_pos = token. end_byte_pos ;
388420
389421 stack. push ( ( next_state as u32 , node) ) ;
390- if !insert_dummy_token {
391- tokens. next ( ) ;
392- }
422+ tokens. next ( ) ;
393423 }
394424 Action :: Reduce ( rule_index) => {
395425 let rule = & RULES [ rule_index] ;
@@ -495,7 +525,7 @@ pub fn parse_with_transformer(
495525 builder : GreenNodeBuilder :: new ( ) ,
496526 } ;
497527 let root: Vec < & Node > = stack[ 1 ..] . iter ( ) . map ( |s| & s. 1 ) . collect ( ) ;
498- let ( ast, resolver) = parser. parse ( & root, extras, & complement_token ) ;
528+ let ( ast, resolver) = parser. parse ( & root, extras) ;
499529
500530 Ok ( SyntaxNode :: new_root_with_resolver ( ast, resolver) )
501531}
0 commit comments