yul_parser/
lexer.rs

1use crate::Token;
2use logos::{self, Logos};
3
4pub struct Lexer<'a> {
5    inner: logos::Lexer<'a, Token>,
6}
7
8impl<'a> Lexer<'a> {
9    pub fn new(input: &'a str) -> Self {
10        Self {
11            inner: Token::lexer(input),
12        }
13    }
14}
15
16impl<'a> Iterator for Lexer<'a> {
17    type Item = (Token, &'a str);
18
19    fn next(&mut self) -> Option<Self::Item> {
20        let kind = self.inner.next()?;
21        let text = self.inner.slice();
22        Some((kind, text))
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29
30    #[test]
31    fn lex_example() {
32        let example = include_str!("../test/example.yul");
33        let tokens = Lexer::new(example)
34            .map(|(a, b)| (a, b.to_string()))
35            .collect::<Vec<_>>();
36        let expected: Vec<(Token, String)> =
37            serde_json::from_str(include_str!("../test/example.lexer.json")).unwrap();
38        assert_eq!(tokens, expected);
39    }
40
41    #[test]
42    fn lex_erc20() {
43        let example = include_str!("../test/erc20.yul");
44        let tokens = Lexer::new(example)
45            .map(|(a, b)| (a, b.to_string()))
46            .collect::<Vec<_>>();
47        let expected: Vec<(Token, String)> =
48            serde_json::from_str(include_str!("../test/erc20.lexer.json")).unwrap();
49        assert_eq!(tokens, expected);
50    }
51}