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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum PartOfSpeach {
/// имя существительное
Noun,
/// имя прилагательное (полное)
Adjf,
/// имя прилагательное (краткое)
Adjs,
/// компаратив
Comp,
/// глагол (личная форма)
Verb,
/// глагол (инфинитив)
Infn,
/// причастие (полное)
Prtf,
/// причастие (краткое)
Prts,
/// деепричастие
Grnd,
/// числительное
Numr,
/// наречие
Advb,
/// местоимение-существительное
Npro,
/// предикатив
Pred,
/// предлог
Prep,
/// союз
Conj,
/// частица
Prcl,
/// междометие
Intj,
}
regex!(
TAG_RE,
r"(?x)
(
NOUN
|ADJF
|ADJS
|COMP
|VERB
|INFN
|PRTF
|PRTS
|GRND
|NUMR
|ADVB
|NPRO
|PRED
|PREP
|CONJ
|PRCL
|INTJ
)
"
);
impl PartOfSpeach {
pub fn try_from_str<S>(s: S) -> Option<Self>
where
S: AsRef<str>,
{
use self::PartOfSpeach::*;
TAG_RE
.captures_iter(s.as_ref())
.next()
.and_then(|cap| match &cap[1] {
"NOUN" => Some(Noun),
"ADJF" => Some(Adjf),
"ADJS" => Some(Adjs),
"COMP" => Some(Comp),
"VERB" => Some(Verb),
"INFN" => Some(Infn),
"PRTF" => Some(Prtf),
"PRTS" => Some(Prts),
"GRND" => Some(Grnd),
"NUMR" => Some(Numr),
"ADVB" => Some(Advb),
"NPRO" => Some(Npro),
"PRED" => Some(Pred),
"PREP" => Some(Prep),
"CONJ" => Some(Conj),
"PRCL" => Some(Prcl),
"INTJ" => Some(Intj),
_ => None,
})
}
pub fn is_productive(self) -> bool {
use self::PartOfSpeach::*;
match self {
Conj | Numr | Npro | Pred | Prep | Prcl | Intj => false,
_ => true,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn try_from_str() {
assert_eq!(Some(PartOfSpeach::Noun), PartOfSpeach::try_from_str("NOUN"));
assert_eq!(
Some(PartOfSpeach::Noun),
PartOfSpeach::try_from_str("NOUN,anim,masc,Fixd,Abbr sing,nomn")
);
assert_eq!(None, PartOfSpeach::try_from_str("UNKN"));
}
}