File: errors.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 (68 lines) | stat: -rw-r--r-- 2,057 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
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
64
65
66
67
68
extern crate peg;

peg::parser!{ grammar parser() for str {
    pub rule one_letter() = ['a'..='z']

    pub rule parse() -> usize
        = v:( "a" / "\n" )* { v.len() }

    pub rule error_pos() = ("a" / "\n" / "\r")*

    pub rule q() = (quiet!{
        ("a" / "b" / "c") ("1" / "2")
    } / expected!("letter followed by number"))+

    pub rule var(s: &'static str) = expected!(s)
}}

fn main() {
    // errors at eof
    assert_eq!(parser::one_letter("t"), Ok(()));

    let err = parser::one_letter("tt").unwrap_err();
    assert_eq!(err.location.line, 1);
    assert_eq!(err.location.column, 2);
    assert_eq!(err.location.offset, 1);
    assert_eq!(format!("{}", err.expected), "EOF");

    // expected character set
    let err = parser::parse(r#"
aaaa
aaaaaa
aaaabaaaa
"#).unwrap_err();

    assert_eq!(err.location.line, 4);
    assert_eq!(err.location.column, 5);
    assert_eq!(err.location.offset, 17);
    assert_eq!(format!("{}", err.expected), r#"one of "\n", "a", EOF"#);

    // error position reporting
    let err = parser::error_pos("aab\n").unwrap_err();
    assert_eq!(err.location.line, 1);
    assert_eq!(err.location.column, 3);
    assert_eq!(err.location.offset, 2);
    assert_eq!(err.expected.to_string(), r#"one of "\n", "\r", "a", EOF"#);

    let err = parser::error_pos("aa\naaaa\nbaaa\n").unwrap_err();
    assert_eq!(err.location.line, 3);
    assert_eq!(err.location.column, 1);

    let err = parser::error_pos("aa\naaaa\naaab\naa").unwrap_err();
    assert_eq!(err.location.line, 3);
    assert_eq!(err.location.column, 4);

    let err = parser::error_pos("aa\r\naaaa\r\naaab\r\naa").unwrap_err();
    assert_eq!(err.location.line, 3);
    assert_eq!(err.location.column, 4);

    parser::q("a1").unwrap();
    parser::q("a1b2").unwrap();
    let err = parser::q("a1bb").unwrap_err();
    assert_eq!(err.location.offset, 2);
    assert_eq!(err.expected.to_string(), "one of EOF, letter followed by number");

    let err = parser::var("", "asdf").unwrap_err();
    assert_eq!(err.expected.to_string(), "asdf");

}