From c493ab69bb132ff1e1bfc0fb845b104fd5ad0dc6 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Sun, 16 Jan 2022 12:27:26 -0800 Subject: [PATCH] Add meta token Signed-off-by: Alek Ratzloff --- src/syn/lexer.rs | 16 ++++++++++++++++ src/syn/token.rs | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/src/syn/lexer.rs b/src/syn/lexer.rs index 2bbf29f..a117275 100644 --- a/src/syn/lexer.rs +++ b/src/syn/lexer.rs @@ -8,6 +8,7 @@ lazy_static! { (?P[-+]?[0-9]+\.[0-9]+([eE][+\-][0-9]+)?) | (?P[-+]?[0-9]+) | (?P=[a-zA-Z_?\-*+/.'@$%^&|][0-9a-zA-Z_?\-*+/=.'@$%^&|]*) + | (?P%[a-zA-Z0-9\-_]+) | (?P[a-zA-Z_?\-*+/=.'@$%^&|][0-9a-zA-Z_?\-*+/=.'@$%^&|]*) | (?P\[) | (?P\]) @@ -89,6 +90,8 @@ impl<'t> Lexer<'t> { self.end = self.end.next_str(cap.get(0).unwrap().as_str()); let sp_token = if let Some(_) = cap.name("assign") { self.make_token(Token::Assign) + } else if let Some(_) = cap.name("meta") { + self.make_token(Token::Meta) } else if let Some(_) = cap.name("word") { self.make_token(Token::Word) } else if let Some(_) = cap.name("float") { @@ -193,6 +196,19 @@ mod test { assert!(lexer.is_eof()); } + #[test] + fn test_meta() { + let mut lexer = Lexer::new(r"%meta %meta1 %include %include1029 %10239meta % %%"); + assert_token!(lexer, Token::Meta, "%meta"); + assert_token!(lexer, Token::Meta, "%meta1"); + assert_token!(lexer, Token::Meta, "%include"); + assert_token!(lexer, Token::Meta, "%include1029"); + assert_token!(lexer, Token::Meta, "%10239meta"); + assert_token!(lexer, Token::Word, "%"); + assert_token!(lexer, Token::Word, "%%"); + assert!(lexer.is_eof()); + } + #[test] fn test_numbers() { let mut lexer = Lexer::new(r"1 -12 123 -9 98 987 -987654321 1248 9764321 -1.2 2.3"); diff --git a/src/syn/token.rs b/src/syn/token.rs index 1043c7c..60508ae 100644 --- a/src/syn/token.rs +++ b/src/syn/token.rs @@ -29,6 +29,9 @@ pub enum Token { /// Apply. Apply, + + /// Meta + Meta, } impl Token { @@ -44,6 +47,7 @@ impl Token { RQuote => "quote end", Colon => "colon", Apply => "apply", + Meta => "meta", } } }