lex: remove DollarBacktick token
can now read src to check dollar before backticks, so simpler to always use backtick token fixes several bugs, e.g. | $`abc` | (previously did not get closed) `$abc$` (previously did not get closed)
This commit is contained in:
		
					parent
					
						
							
								b2d15383e7
							
						
					
				
			
			
				commit
				
					
						116fb04725
					
				
			
		
					 2 changed files with 34 additions and 36 deletions
				
			
		| 
						 | 
					@ -372,19 +372,38 @@ impl<'s> Parser<'s> {
 | 
				
			||||||
                self.push(EventKind::Str);
 | 
					                self.push(EventKind::Str);
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            Some(Continue)
 | 
					            Some(Continue)
 | 
				
			||||||
 | 
					        } else if matches!(first.kind, lex::Kind::Seq(Sequence::Backtick)) {
 | 
				
			||||||
 | 
					            let len_opener = u8::try_from(first.len).ok()?;
 | 
				
			||||||
 | 
					            let ty = if let Some(sp) = self
 | 
				
			||||||
 | 
					                .events
 | 
				
			||||||
 | 
					                .back()
 | 
				
			||||||
 | 
					                .and_then(|e| matches!(&e.kind, EventKind::Str).then(|| e.span))
 | 
				
			||||||
 | 
					                .filter(|sp| {
 | 
				
			||||||
 | 
					                    sp.end() == self.input.span.start()
 | 
				
			||||||
 | 
					                        && sp.of(self.input.src).as_bytes()[sp.len() - 1] == b'$'
 | 
				
			||||||
 | 
					                        && sp
 | 
				
			||||||
 | 
					                            .end()
 | 
				
			||||||
 | 
					                            .checked_sub(2)
 | 
				
			||||||
 | 
					                            .map_or(true, |i| self.input.src.as_bytes()[i] != b'\\')
 | 
				
			||||||
 | 
					                }) {
 | 
				
			||||||
 | 
					                let (ty, num_dollar) = if sp.len() > 1
 | 
				
			||||||
 | 
					                    && sp.of(self.input.src).as_bytes()[sp.len() - 2] == b'$'
 | 
				
			||||||
 | 
					                    && sp
 | 
				
			||||||
 | 
					                        .end()
 | 
				
			||||||
 | 
					                        .checked_sub(3)
 | 
				
			||||||
 | 
					                        .map_or(true, |i| self.input.src.as_bytes()[i] != b'\\')
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    (DisplayMath, 2)
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
            let (ty, len_opener) = match first.kind {
 | 
					                    (InlineMath, 1)
 | 
				
			||||||
                lex::Kind::DollarBacktick(l) if first.len - l as usize == 1 => {
 | 
					                };
 | 
				
			||||||
                    Some((InlineMath, l))
 | 
					                let border = sp.end() - num_dollar;
 | 
				
			||||||
                }
 | 
					                self.events.back_mut().unwrap().span = Span::new(sp.start(), border);
 | 
				
			||||||
                lex::Kind::DollarBacktick(l) if first.len - l as usize == 2 => {
 | 
					                self.input.span = Span::new(border, self.input.span.end());
 | 
				
			||||||
                    Some((DisplayMath, l))
 | 
					                ty
 | 
				
			||||||
                }
 | 
					            } else {
 | 
				
			||||||
                lex::Kind::Seq(Sequence::Backtick) if first.len < 256 => {
 | 
					                Verbatim
 | 
				
			||||||
                    Some((Verbatim, first.len as u8))
 | 
					            };
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                _ => None,
 | 
					 | 
				
			||||||
            }?;
 | 
					 | 
				
			||||||
            self.push_sp(EventKind::Placeholder, self.input.span.empty_before());
 | 
					            self.push_sp(EventKind::Placeholder, self.input.span.empty_before());
 | 
				
			||||||
            self.verbatim = Some(VerbatimState {
 | 
					            self.verbatim = Some(VerbatimState {
 | 
				
			||||||
                event_opener: self.events.len(),
 | 
					                event_opener: self.events.len(),
 | 
				
			||||||
| 
						 | 
					@ -394,6 +413,8 @@ impl<'s> Parser<'s> {
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            self.attributes = None;
 | 
					            self.attributes = None;
 | 
				
			||||||
            self.push(EventKind::Enter(ty))
 | 
					            self.push(EventKind::Enter(ty))
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            None
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										23
									
								
								src/lex.rs
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								src/lex.rs
									
										
									
									
									
								
							| 
						 | 
					@ -20,7 +20,6 @@ pub enum Kind {
 | 
				
			||||||
    Close(Delimiter),
 | 
					    Close(Delimiter),
 | 
				
			||||||
    Sym(Symbol),
 | 
					    Sym(Symbol),
 | 
				
			||||||
    Seq(Sequence),
 | 
					    Seq(Sequence),
 | 
				
			||||||
    DollarBacktick(u8),
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
					#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
				
			||||||
| 
						 | 
					@ -239,20 +238,6 @@ impl<'s> Lexer<'s> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    '`' => self.eat_seq(Backtick),
 | 
					                    '`' => self.eat_seq(Backtick),
 | 
				
			||||||
                    '.' => self.eat_seq(Period),
 | 
					                    '.' => self.eat_seq(Period),
 | 
				
			||||||
                    '$' => {
 | 
					 | 
				
			||||||
                        self.eat_while(|c| c == '$');
 | 
					 | 
				
			||||||
                        let mut n_ticks: u8 = 0;
 | 
					 | 
				
			||||||
                        self.eat_while(|c| {
 | 
					 | 
				
			||||||
                            if c == '`' {
 | 
					 | 
				
			||||||
                                if let Some(l) = n_ticks.checked_add(1) {
 | 
					 | 
				
			||||||
                                    n_ticks = l;
 | 
					 | 
				
			||||||
                                    return true;
 | 
					 | 
				
			||||||
                                }
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                            false
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                        DollarBacktick(n_ticks)
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    _ => Text,
 | 
					                    _ => Text,
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					@ -312,7 +297,6 @@ fn is_special(c: char) -> bool {
 | 
				
			||||||
            | ':'
 | 
					            | ':'
 | 
				
			||||||
            | '`'
 | 
					            | '`'
 | 
				
			||||||
            | '.'
 | 
					            | '.'
 | 
				
			||||||
            | '$'
 | 
					 | 
				
			||||||
            | '\n'
 | 
					            | '\n'
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -418,11 +402,4 @@ mod test {
 | 
				
			||||||
            Seq(Period).l(1),
 | 
					            Seq(Period).l(1),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    #[test]
 | 
					 | 
				
			||||||
    fn dollar_backtick() {
 | 
					 | 
				
			||||||
        test_lex!("$`", DollarBacktick(1).l(2));
 | 
					 | 
				
			||||||
        test_lex!("$$$`", DollarBacktick(1).l(4));
 | 
					 | 
				
			||||||
        test_lex!("$$````", DollarBacktick(4).l(6));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue