@@ -9,54 +9,50 @@ pub mod ast;
9
9
lalrpop_mod ! ( pub parser) ;
10
10
11
11
use lalrpop_util:: ParseError ;
12
- use std:: fmt:: Write ;
13
12
14
13
type Result < T > = std:: result:: Result < T , Box < dyn std:: error:: Error > > ;
15
14
16
15
pub fn parse_program ( text : & str ) -> Result < ast:: Program > {
17
- match parser:: ProgramParser :: new ( ) . parse ( text) {
18
- Ok ( v) => Ok ( v) ,
19
- Err ( e) => Err ( format ! ( "parse error: {}" , e) . into ( ) ) ,
20
- }
16
+ parser:: ProgramParser :: new ( )
17
+ . parse ( text)
18
+ . map_err ( |e| format ! ( "parse error: {}" , e) . into ( ) )
21
19
}
22
20
23
21
pub fn parse_ty ( text : & str ) -> Result < ast:: Ty > {
24
- match parser:: TyParser :: new ( ) . parse ( text) {
25
- Ok ( v) => Ok ( v) ,
26
- Err ( e) => Err ( format ! ( "error parsing `{}`: {}" , text, e) . into ( ) ) ,
27
- }
22
+ parser:: TyParser :: new ( )
23
+ . parse ( text)
24
+ . map_err ( |e| format ! ( "error parsing `{}`: {}" , text, e) . into ( ) )
28
25
}
29
26
30
27
pub fn parse_goal ( text : & str ) -> Result < Box < ast:: Goal > > {
31
- match parser:: GoalParser :: new ( ) . parse ( text) {
32
- Ok ( v) => Ok ( v) ,
33
- Err ( e) => {
34
- let position_string = |start : usize , end : usize | {
35
- let mut output = String :: new ( ) ;
36
- let text = text. replace ( "\n " , " " ) . replace ( "\r " , " " ) ;
37
- writeln ! ( output, "position: `{}`" , text) . expect ( "str-write cannot fail" ) ;
38
- output. push_str ( & " " . repeat ( 11 + start) ) ;
39
- output. push_str ( & "^" . repeat ( end - start) ) ;
40
- output. push_str ( "\n " ) ;
41
- output
42
- } ;
43
- match e {
44
- ParseError :: InvalidToken { location } => Err ( format ! (
45
- "parse error: {}\n {}" ,
46
- e,
47
- position_string( location, location + 1 )
48
- )
49
- . into ( ) ) ,
50
- ParseError :: UnrecognizedToken {
51
- token : ( start, _, end) ,
52
- ..
53
- } => Err ( format ! ( "parse error: {}\n {}" , e, position_string( start, end) ) . into ( ) ) ,
54
- ParseError :: ExtraToken {
55
- token : ( start, _, end) ,
56
- ..
57
- } => Err ( format ! ( "parse error: {}\n {}" , e, position_string( start, end) ) . into ( ) ) ,
58
- _ => Err ( format ! ( "parse error: {}" , e) . into ( ) ) ,
28
+ parser:: GoalParser :: new ( ) . parse ( text) . map_err ( |e| {
29
+ let mut output = format ! ( "parse error: {}" , & e) ;
30
+ if let Some ( s) = match e {
31
+ ParseError :: InvalidToken { location } => {
32
+ Some ( position_string ( text, location, location + 1 ) )
59
33
}
34
+ ParseError :: UnrecognizedToken {
35
+ token : ( start, _, end) ,
36
+ ..
37
+ } => Some ( position_string ( text, start, end) ) ,
38
+ ParseError :: ExtraToken {
39
+ token : ( start, _, end) ,
40
+ ..
41
+ } => Some ( position_string ( text, start, end) ) ,
42
+ _ => None ,
43
+ } {
44
+ output. push ( '\n' ) ;
45
+ output += & s;
60
46
}
61
- }
47
+ output. into ( )
48
+ } )
49
+ }
50
+
51
+ fn position_string ( text : & str , start : usize , end : usize ) -> String {
52
+ let text = text. replace ( '\n' , " " ) . replace ( '\r' , " " ) ;
53
+ let mut output = format ! ( "position: `{}`" , text) ;
54
+ output += & " " . repeat ( 11 + start) ;
55
+ output += & "^" . repeat ( end - start) ;
56
+ output. push ( '\n' ) ;
57
+ output
62
58
}
0 commit comments