File: custom_expr.rs

package info (click to toggle)
rust-peg 0.8.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 756 kB
  • sloc: makefile: 20; sh: 12
file content (25 lines) | stat: -rw-r--r-- 820 bytes parent folder | download
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
use peg::RuleResult;

peg::parser!( grammar test() for str {
    rule position() -> usize = #{|input, pos| RuleResult::Matched(pos, pos)}
    pub rule test1() -> usize = ['a']* p1:position() ['b']* { p1 }

    pub rule fail() -> usize = #{|input, pos| RuleResult::Failed}

    rule custom_literal(literal: &str) = #{|input, pos| {
        let l = literal.len();
        if input.len() >= pos + l && &input.as_bytes()[pos..pos + l] == literal.as_bytes() {
            RuleResult::Matched(pos + l, ())
        } else {
            RuleResult::Failed
        }
    }}
    pub rule test2() = custom_literal("foo") "_" custom_literal("bar")
});

fn main() {
    assert_eq!(test::test1("aaaabb"), Ok(4));
    assert_eq!(test::fail("aaaabb").unwrap_err().location.offset, 0);

    assert_eq!(test::test2("foo_bar"), Ok(()));
}