udled_tokenizers/
ident.rs1use udled::{
2 any,
3 tokenizers::{AlphaNumeric, Alphabetic},
4 AsChar, AsSlice, Buffer, Error, Item, Reader, Tokenizer, TokenizerExt,
5};
6
7#[derive(Debug, Clone, Copy, Default)]
9pub struct Ident;
10
11impl<'input, B> Tokenizer<'input, B> for Ident
12where
13 B: Buffer<'input>,
14 B::Item: AsChar,
15 B::Source: AsSlice<'input>,
16{
17 type Token = Item<<B::Source as AsSlice<'input>>::Slice>;
18
19 fn to_token(&self, reader: &mut Reader<'_, 'input, B>) -> Result<Self::Token, Error> {
20 let item =
21 reader.parse((Alphabetic.or('_'), AlphaNumeric.or('_').many().optional()).slice())?;
22
23 Ok(item)
24 }
25
26 fn peek<'a>(&self, reader: &mut Reader<'_, 'input, B>) -> bool {
27 reader.is(Alphabetic.or('_'))
28 }
29}
30
31pub struct XmlIdent;
33
34impl XmlIdent {}
35
36impl<'input, B> Tokenizer<'input, B> for XmlIdent
37where
38 B: Buffer<'input>,
39 B::Item: AsChar,
40 B::Source: AsSlice<'input>,
41{
42 type Token = Item<<B::Source as AsSlice<'input>>::Slice>;
43
44 fn to_token(&self, reader: &mut Reader<'_, 'input, B>) -> Result<Self::Token, Error> {
45 let start_tokenizer = any!(
46 ':',
47 'a'..='z',
48 'A'..='Z',
49 '\u{2070}'..='\u{218F}',
50 '\u{2C00}'..='\u{2FEF}',
51 '\u{3001}'..='\u{D7FF}',
52 '\u{F900}'..='\u{FDCF}',
53 '\u{FDF0}'..='\u{FFFD}'
54 );
55 let rest_tokenizer = any!(
56 '0'..='9',
57 '-',
58 '.',
59 '_',
60 '\u{00B7}',
61 '\u{0300}'..='\u{036F}',
62 '\u{203F}'..='\u{2040}'
63 );
64
65 let all = any!(&start_tokenizer, rest_tokenizer);
66
67 reader.parse((&start_tokenizer, all.many()).slice())
68 }
69
70 fn peek(&self, reader: &mut Reader<'_, 'input, B>) -> bool {
71 reader.is(any!(
72 ':',
73 'a'..='z',
74 'A'..='Z',
75 '\u{2070}'..='\u{218F}',
76 '\u{2C00}'..='\u{2FEF}',
77 '\u{3001}'..='\u{D7FF}',
78 '\u{F900}'..='\u{FDCF}',
79 '\u{FDF0}'..='\u{FFFD}'
80 ))
81 }
82}
83
84