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
42use crate::query::filter::{Expr, VMState};
grammar;
pub top: Expr = {
expr+ => Expr::multiple(<>)
};
expr: Expr = {
<e1:expr> "or" <e2:subexpr> => Expr::Or(Box::new(e1), Box::new(e2)),
<e:subexpr> => e,
};
subexpr : Expr = {
<e1:subexpr> "and" <e2:subexpr2> => Expr::And(Box::new(e1), Box::new(e2)),
<e:subexpr2> => e,
};
subexpr2 : Expr = {
"not:" <e:subexpr3> => Expr::Not(Box::new(e)),
<e:subexpr3> => e,
};
subexpr3 : Expr = {
<e:lowexpr> => e,
};
lowexpr : Expr = {
"running" => Expr::State(VMState::Running),
"stopped" => Expr::State(VMState::Stopped),
string => Expr::Substring(<>),
"(" <e:top> ")" => e,
}
number: u64 = {
<s:r"[0-9]+"> => s.parse().unwrap()
}
string: String = {
<s:r#"name:[^ ]+"#> => s[5..].to_owned(),
}