Implement expect macro

Seems like there's no way around passing in self manually
This commit is contained in:
greg 2015-12-25 03:22:36 -08:00
parent 509ab80b9c
commit 186c900920

View File

@ -29,35 +29,31 @@ struct Parser<'a> {
tokens: Peekable<Iter<'a, Token>> tokens: Peekable<Iter<'a, Token>>
} }
macro_rules! expect {
($tok:expr, $self_:ident) => {
match $self_.tokens.next() {
Some(next) if *next == $tok => (),
Some(next) => {
let err = format!("Expected {:?} but got {:?}", $tok, next);
return Err(ParseError { err: err });
},
None => {
let err = format!("Expected {:?} but got end of input", $tok);
return Err(ParseError { err: err });
}
}
}
}
impl<'a> Parser<'a> { impl<'a> Parser<'a> {
fn parse(&mut self) -> ParseResult { fn parse(&mut self) -> ParseResult {
let r = self.expr(); let r = self.expr();
match self.expect(Token::Separator) { expect!(Token::Separator, self);
None => (), expect!(Token::EOF, self);
Some(err) => return Err(err)
}
match self.expect(Token::EOF) {
None => (),
Some(err) => return Err(err)
}
r r
} }
fn expect(&mut self, expected: Token) -> Option<ParseError> {
match self.tokens.next() {
Some(next) if *next == expected => None,
Some(next) => {
let err = format!("Expected {:?} but got {:?}", expected, next);
Some(ParseError { err: err })
}
None => {
let err = format!("Expected {:?} but got end of input", expected);
Some(ParseError { err: err })
}
}
}
fn expr(&mut self) -> ParseResult { fn expr(&mut self) -> ParseResult {
self.tokens.next(); self.tokens.next();
return Ok(AST::Number(5.0)); return Ok(AST::Number(5.0));