use tokens;
ast_enum! {
#[cfg_attr(feature = "clone-impls", derive(Copy))]
pub enum BinOp {
Add(tokens::Add),
Sub(tokens::Sub),
Mul(tokens::Star),
Div(tokens::Div),
Rem(tokens::Rem),
And(tokens::AndAnd),
Or(tokens::OrOr),
BitXor(tokens::Caret),
BitAnd(tokens::And),
BitOr(tokens::Or),
Shl(tokens::Shl),
Shr(tokens::Shr),
Eq(tokens::EqEq),
Lt(tokens::Lt),
Le(tokens::Le),
Ne(tokens::Ne),
Ge(tokens::Ge),
Gt(tokens::Gt),
AddEq(tokens::AddEq),
SubEq(tokens::SubEq),
MulEq(tokens::MulEq),
DivEq(tokens::DivEq),
RemEq(tokens::RemEq),
BitXorEq(tokens::CaretEq),
BitAndEq(tokens::AndEq),
BitOrEq(tokens::OrEq),
ShlEq(tokens::ShlEq),
ShrEq(tokens::ShrEq),
}
}
ast_enum! {
#[cfg_attr(feature = "clone-impls", derive(Copy))]
pub enum UnOp {
Deref(tokens::Star),
Not(tokens::Bang),
Neg(tokens::Sub),
}
}
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
use synom::Synom;
use synom::tokens::*;
impl BinOp {
named!(pub parse_binop -> Self, alt!(
syn!(AndAnd) => { BinOp::And }
|
syn!(OrOr) => { BinOp::Or }
|
syn!(Shl) => { BinOp::Shl }
|
syn!(Shr) => { BinOp::Shr }
|
syn!(EqEq) => { BinOp::Eq }
|
syn!(Le) => { BinOp::Le }
|
syn!(Ne) => { BinOp::Ne }
|
syn!(Ge) => { BinOp::Ge }
|
syn!(Add) => { BinOp::Add }
|
syn!(Sub) => { BinOp::Sub }
|
syn!(Star) => { BinOp::Mul }
|
syn!(Div) => { BinOp::Div }
|
syn!(Rem) => { BinOp::Rem }
|
syn!(Caret) => { BinOp::BitXor }
|
syn!(And) => { BinOp::BitAnd }
|
syn!(Or) => { BinOp::BitOr }
|
syn!(Lt) => { BinOp::Lt }
|
syn!(Gt) => { BinOp::Gt }
));
#[cfg(feature = "full")]
named!(pub parse_assign_op -> Self, alt!(
syn!(AddEq) => { BinOp::AddEq }
|
syn!(SubEq) => { BinOp::SubEq }
|
syn!(MulEq) => { BinOp::MulEq }
|
syn!(DivEq) => { BinOp::DivEq }
|
syn!(RemEq) => { BinOp::RemEq }
|
syn!(CaretEq) => { BinOp::BitXorEq }
|
syn!(AndEq) => { BinOp::BitAndEq }
|
syn!(OrEq) => { BinOp::BitOrEq }
|
syn!(ShlEq) => { BinOp::ShlEq }
|
syn!(ShrEq) => { BinOp::ShrEq }
));
}
impl Synom for UnOp {
named!(parse -> Self, alt!(
syn!(Star) => { UnOp::Deref }
|
syn!(Bang) => { UnOp::Not }
|
syn!(Sub) => { UnOp::Neg }
));
}
}
#[cfg(feature = "printing")]
mod printing {
use super::*;
use quote::{Tokens, ToTokens};
impl ToTokens for BinOp {
fn to_tokens(&self, tokens: &mut Tokens) {
match *self {
BinOp::Add(ref t) => t.to_tokens(tokens),
BinOp::Sub(ref t) => t.to_tokens(tokens),
BinOp::Mul(ref t) => t.to_tokens(tokens),
BinOp::Div(ref t) => t.to_tokens(tokens),
BinOp::Rem(ref t) => t.to_tokens(tokens),
BinOp::And(ref t) => t.to_tokens(tokens),
BinOp::Or(ref t) => t.to_tokens(tokens),
BinOp::BitXor(ref t) => t.to_tokens(tokens),
BinOp::BitAnd(ref t) => t.to_tokens(tokens),
BinOp::BitOr(ref t) => t.to_tokens(tokens),
BinOp::Shl(ref t) => t.to_tokens(tokens),
BinOp::Shr(ref t) => t.to_tokens(tokens),
BinOp::Eq(ref t) => t.to_tokens(tokens),
BinOp::Lt(ref t) => t.to_tokens(tokens),
BinOp::Le(ref t) => t.to_tokens(tokens),
BinOp::Ne(ref t) => t.to_tokens(tokens),
BinOp::Ge(ref t) => t.to_tokens(tokens),
BinOp::Gt(ref t) => t.to_tokens(tokens),
BinOp::AddEq(ref t) => t.to_tokens(tokens),
BinOp::SubEq(ref t) => t.to_tokens(tokens),
BinOp::MulEq(ref t) => t.to_tokens(tokens),
BinOp::DivEq(ref t) => t.to_tokens(tokens),
BinOp::RemEq(ref t) => t.to_tokens(tokens),
BinOp::BitXorEq(ref t) => t.to_tokens(tokens),
BinOp::BitAndEq(ref t) => t.to_tokens(tokens),
BinOp::BitOrEq(ref t) => t.to_tokens(tokens),
BinOp::ShlEq(ref t) => t.to_tokens(tokens),
BinOp::ShrEq(ref t) => t.to_tokens(tokens),
}
}
}
impl ToTokens for UnOp {
fn to_tokens(&self, tokens: &mut Tokens) {
match *self {
UnOp::Deref(ref t) => t.to_tokens(tokens),
UnOp::Not(ref t) => t.to_tokens(tokens),
UnOp::Neg(ref t) => t.to_tokens(tokens),
}
}
}
}