1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//! Parser for basic alphabets defined in the table 1 of ISO-10303-21

use super::combinator::*;
use nom::{
    branch::alt,
    character::complete::{char, satisfy},
    Parser,
};

/// latin_codepoint = [space] | [digit] | [lower] | [upper] | [special] | [reverse_solidus] | [apostrophe]
pub fn latin_codepoint(input: &str) -> ParseResult<char> {
    alt((
        space,
        digit,
        lower,
        upper,
        special,
        reverse_solidus,
        apostrophe,
    ))
    .parse(input)
}

/// space = ` ` .
pub fn space(input: &str) -> ParseResult<char> {
    char(' ')(input)
}

/// digit = `0` | `1` | `2` | `3` | `4` | `5` | `6` | `7` | `8` | `9` .
pub fn digit(input: &str) -> ParseResult<char> {
    satisfy(|c| matches!(c, '0'..='9')).parse(input)
}

/// lower = `a` | `b` | `c` | `d` | `e` | `f` | `g` | `h`
///       | `i` | `j` | `k` | `l` | `m` | `n` | `o` | `p`
///       | `q` | `r` | `s` | `t` | `u` | `v` | `w` | `x`
///       | `y` | `z` .
pub fn lower(input: &str) -> ParseResult<char> {
    satisfy(|c| matches!(c, 'a'..='z')).parse(input)
}

/// upper = `A` | `B` | `C` | `D` | `E` | `F` | `G` | `H`
///       | `I` | `J` | `K` | `L` | `M` | `N` | `O` | `P`
///       | `Q` | `R` | `S` | `T` | `U` | `V` | `W` | `X`
///       | `Y` | `Z` | `_` .
pub fn upper(input: &str) -> ParseResult<char> {
    satisfy(|c| matches!(c, 'A'..='Z' | '_')).parse(input)
}

/// special  = `!` | `"` | `*` | `$` | `%` | `&` | `.` | `#` | `+` | `,`  | `-` | `(` | `)` | `?` | `/` | `:` | `;` | `<`  | `=` | `>` | `@` | `[` | `]` | `{` | `|` | `}`  | `^` | \` | `~` .
pub fn special(input: &str) -> ParseResult<char> {
    satisfy(|c| {
        matches!(
            c,
            '!' | '"'
                | '*'
                | '$'
                | '%'
                | '&'
                | '.'
                | '#'
                | '+'
                | ','
                | '-'
                | '('
                | ')'
                | '?'
                | '/'
                | ':'
                | ';'
                | '<'
                | '='
                | '>'
                | '@'
                | '['
                | ']'
                | '{'
                | '|'
                | '}'
                | '^'
                | '`'
                | '~'
        )
    })
    .parse(input)
}

/// reverse_solidus = `\\` .
pub fn reverse_solidus(input: &str) -> ParseResult<char> {
    char('\\')(input)
}

/// apostrophe = `'` .
pub fn apostrophe(input: &str) -> ParseResult<char> {
    char('\'')(input)
}