lexgen 0.16.0

A fully-featured lexer generator implemented as a proc macro
Documentation
use crate::collections::Map;

use std::collections::hash_map::Entry;

pub struct SearchTableSet {
    tables: Map<Vec<(char, char)>, syn::Ident>,
}

impl SearchTableSet {
    pub fn new() -> SearchTableSet {
        SearchTableSet {
            tables: Default::default(),
        }
    }

    pub fn add_table(&mut self, ranges: Vec<(char, char)>) -> syn::Ident {
        let n_tables = self.tables.len();
        match self.tables.entry(ranges) {
            Entry::Occupied(entry) => entry.get().clone(),
            Entry::Vacant(entry) => {
                let ident = syn::Ident::new(
                    &format!("RANGE_TABLE_{}", n_tables),
                    proc_macro2::Span::call_site(),
                );
                entry.insert(ident.clone());
                ident
            }
        }
    }

    pub fn iter(&self) -> impl Iterator<Item = (&[(char, char)], &syn::Ident)> {
        self.tables
            .iter()
            .map(|(ranges, ident)| (ranges.as_slice(), ident))
    }

    pub fn is_empty(&self) -> bool {
        self.tables.is_empty()
    }
}