rustre_parser/parser/
body.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
use super::*;

pub fn parse_body<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    node(
        BodyNode,
        many_delimited(t(Let), parse_equation, success, t(Tel)),
    )(input)
}

pub fn parse_equation_list<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    many0(parse_equation)(input)
}

pub fn parse_equation<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    join((
        alt((parse_equation_assert, parse_equation_equals)),
        expect(t(Semicolon), "expected semicolon after equation"),
    ))(input)
}

fn parse_equation_assert<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    node(
        AssertEquationNode,
        join((
            t(Assert),
            expect(
                expression::parse_expression,
                "expected expression after `assert`",
            ),
        )),
    )(input)
}

fn parse_equation_equals<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    node(
        EqualsEquationNode,
        join((
            alt((
                join((
                    left::parse_left,
                    expect(t(Equal), "missing `=` in equation"),
                )),
                join((
                    expect(left::parse_left, "missing left operand in equation"),
                    t(Equal),
                )),
            )),
            expect(
                expression::parse_expression,
                "expected expression at the right of the equation",
            ),
        )),
    )(input)
}