๐Ÿ“ฆ da-x / vmess

๐Ÿ“„ expr.lalrpop ยท 42 lines
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(),
}