@@ -2,6 +2,7 @@ use getopts::Options;
2
2
use std:: {
3
3
env,
4
4
error:: Error ,
5
+ fmt,
5
6
fs:: File ,
6
7
io:: { stderr, stdin, Read , Write } ,
7
8
path:: Path ,
@@ -17,6 +18,22 @@ use lrpar::{
17
18
18
19
const ERROR : & str = "[Error]" ;
19
20
21
+ /// A string which uses `Display` for it's `Debug` impl.
22
+ struct ErrorString ( String ) ;
23
+ impl fmt:: Display for ErrorString {
24
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
25
+ let ErrorString ( s) = self ;
26
+ write ! ( f, "{}" , s)
27
+ }
28
+ }
29
+ impl fmt:: Debug for ErrorString {
30
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
31
+ let ErrorString ( s) = self ;
32
+ write ! ( f, "{}" , s)
33
+ }
34
+ }
35
+ impl Error for ErrorString { }
36
+
20
37
fn usage ( prog : & str , msg : & str ) {
21
38
let path = Path :: new ( prog) ;
22
39
let leaf = match path. file_name ( ) {
@@ -109,9 +126,18 @@ fn main() -> Result<(), Box<dyn Error>> {
109
126
lexerdef
110
127
}
111
128
_ => {
112
- return Err ( "Unrecognized lexer kind" ) ?;
129
+ return Err ( ErrorString ( "Unrecognized lexer kind" . to_string ( ) ) ) ?;
113
130
}
114
131
} ;
132
+ {
133
+ let unused_header_values = header. unused ( ) ;
134
+ if !unused_header_values. is_empty ( ) {
135
+ return Err ( ErrorString ( format ! (
136
+ "Unused header values: {}" ,
137
+ unused_header_values. join( ", " )
138
+ ) ) ) ?;
139
+ }
140
+ }
115
141
let input = & read_file ( & matches. free [ 1 ] ) ;
116
142
for r in lexerdef. lexer ( input) . iter ( ) {
117
143
match r {
0 commit comments