Add support for parsing vectors in the elisp parser.
This commit is contained in:
		
							parent
							
								
									d1e0ee831c
								
							
						
					
					
						commit
						cf0991fdff
					
				| @ -23,6 +23,7 @@ pub enum Token<'s> { | ||||
|     Atom(&'s str), | ||||
|     List(Vec<Token<'s>>), | ||||
|     TextWithProperties(TextWithProperties<'s>), | ||||
|     Vector(Vec<Token<'s>>), | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| @ -136,7 +137,7 @@ pub fn sexp<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| fn token<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { | ||||
|     alt((list, atom))(input) | ||||
|     alt((list, vector, atom))(input) | ||||
| } | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| @ -151,16 +152,29 @@ fn list<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { | ||||
|     Ok((remaining, Token::List(children))) | ||||
| } | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| fn vector<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { | ||||
|     let (remaining, _) = tag("[")(input)?; | ||||
|     let (remaining, children) = delimited( | ||||
|         multispace0, | ||||
|         separated_list1(multispace1, token), | ||||
|         multispace0, | ||||
|     )(remaining)?; | ||||
|     let (remaining, _) = tag("]")(remaining)?; | ||||
|     Ok((remaining, Token::Vector(children))) | ||||
| } | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| fn atom<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { | ||||
|     not(peek(tag(")")))(input)?; | ||||
|     not(peek(one_of(")]")))(input)?; | ||||
|     // TODO: Add calls to hash notation
 | ||||
|     alt((text_with_properties, quoted_atom, unquoted_atom))(input) | ||||
| } | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| fn unquoted_atom<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { | ||||
|     let (remaining, body) = take_till1(|c| match c { | ||||
|         ' ' | '\t' | '\r' | '\n' | ')' => true, | ||||
|         ' ' | '\t' | '\r' | '\n' | ')' | ']' => true, | ||||
|         _ => false, | ||||
|     })(input)?; | ||||
|     Ok((remaining, Token::Atom(body))) | ||||
| @ -237,6 +251,7 @@ mod tests { | ||||
|             Token::Atom(_) => false, | ||||
|             Token::List(_) => true, | ||||
|             Token::TextWithProperties(_) => false, | ||||
|             Token::Vector(_) => false, | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| @ -249,6 +264,7 @@ mod tests { | ||||
|             Token::Atom(_) => false, | ||||
|             Token::List(_) => true, | ||||
|             Token::TextWithProperties(_) => false, | ||||
|             Token::Vector(_) => false, | ||||
|         }); | ||||
|         let children = match parsed { | ||||
|             Token::List(children) => children, | ||||
| @ -308,6 +324,7 @@ mod tests { | ||||
|             Token::Atom(_) => false, | ||||
|             Token::List(_) => true, | ||||
|             Token::TextWithProperties(_) => false, | ||||
|             Token::Vector(_) => false, | ||||
|         }); | ||||
|         let children = match parsed { | ||||
|             Token::List(children) => children, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander