#[macro_export]
macro_rules! try_some {
($expr:expr) => {
match $expr {
Ok(Some(v)) => Some(v),
Ok(None) => None,
Err(e) => return Some(Err(From::from(e))),
}
};
}
#[macro_export]
macro_rules! try_err {
($expr:expr) => {
match $expr {
Ok(v) => v,
Err(e) => return Some(Err(From::from(e))),
}
};
}
#[macro_export]
macro_rules! accept {
($parser:expr, $toktype:ident) => {
match $parser.lexer.peek() {
Some(Ok(::lexer::Token {
kind: ::lexer::TokenKind::$toktype,
..
})) => {
$parser.lexer.next();
Ok(Some(::lexer::TokenKind::$toktype))
}
Some(&Err(_)) => match $parser.lexer.next() {
Some(Err(e)) => Err(e),
_ => unreachable!(),
},
_ => Ok(None),
}
};
($parser:expr, $toktype:ident, $tokdata:ident) => {
match $parser.lexer.peek() {
Some(Ok(::lexer::Token {
kind: ::lexer::TokenKind::$toktype(_),
..
})) => match $parser.lexer.next() {
Some(Ok(::lexer::Token {
kind: ::lexer::TokenKind::$toktype($tokdata),
..
})) => Ok(Some($tokdata)),
_ => unreachable!(),
},
Some(&Err(_)) => match $parser.lexer.next() {
Some(Err(e)) => Err(e),
_ => unreachable!(),
},
_ => Ok(None),
}
};
}
#[macro_export]
macro_rules! expect {
($parser:expr, $toktype:ident) => {
match accept!($parser, $toktype) {
Ok(Some(t)) => Ok(t),
Ok(None) => Err(::err::ParseError::UnexpectedToken),
Err(e) => Err(e.into()),
}
};
($parser:expr, $toktype:ident, $tokdata:ident) => {
match accept!($parser, $toktype, $tokdata) {
Ok(Some(t)) => Ok(t),
Ok(None) => Err(::err::ParseError::UnexpectedToken),
Err(e) => Err(e.into()),
}
};
}