rustre_parser/parser/
left.rs

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
use super::*;

pub fn parse_left<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    node(
        LeftNode,
        alt((
            many_delimited(t(OpenPar), parse_left_item, t(Comma), t(ClosePar)),
            many_delimited(success, parse_left_item, t(Comma), peek(t(Equal))),
        )),
    )(input)
}

pub fn parse_left_item<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    fold_many1(
        ident::parse_id_any,
        alt((
            map(join((t(Dot), ident::parse_id_any)), |c| {
                (c, LeftFieldAccessNode)
            }),
            map(
                many_delimited(
                    t(OpenBracket),
                    expect(
                        alt((parse_select, expression::parse_expression)),
                        "expected expression or select",
                    ),
                    eof,
                    t(CloseBracket),
                ),
                |c| (c, LeftTableAccessNode),
            ),
        )),
        |a, (b, n)| (a + b).into_node(n),
    )(input)
}

pub fn parse_select<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    node(
        SelectNode,
        join((
            expression::parse_expression_15,
            t(CDots),
            expect(
                expression::parse_expression_15,
                "expected second operand in step expression",
            ),
            parse_step,
        )),
    )(input)
}

pub fn parse_step<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    opt(node(
        StepNode,
        join((
            t(Step),
            expect(
                expression::parse_expression_16,
                "expected expression after `step`",
            ),
        )),
    ))(input)
}