| use tokens; |
| |
| ast_enum! { |
| #[cfg_attr(feature = "clone-impls", derive(Copy))] |
| pub enum BinOp { |
| /// The `+` operator (addition) |
| Add(tokens::Add), |
| /// The `-` operator (subtraction) |
| Sub(tokens::Sub), |
| /// The `*` operator (multiplication) |
| Mul(tokens::Star), |
| /// The `/` operator (division) |
| Div(tokens::Div), |
| /// The `%` operator (modulus) |
| Rem(tokens::Rem), |
| /// The `&&` operator (logical and) |
| And(tokens::AndAnd), |
| /// The `||` operator (logical or) |
| Or(tokens::OrOr), |
| /// The `^` operator (bitwise xor) |
| BitXor(tokens::Caret), |
| /// The `&` operator (bitwise and) |
| BitAnd(tokens::And), |
| /// The `|` operator (bitwise or) |
| BitOr(tokens::Or), |
| /// The `<<` operator (shift left) |
| Shl(tokens::Shl), |
| /// The `>>` operator (shift right) |
| Shr(tokens::Shr), |
| /// The `==` operator (equality) |
| Eq(tokens::EqEq), |
| /// The `<` operator (less than) |
| Lt(tokens::Lt), |
| /// The `<=` operator (less than or equal to) |
| Le(tokens::Le), |
| /// The `!=` operator (not equal to) |
| Ne(tokens::Ne), |
| /// The `>=` operator (greater than or equal to) |
| Ge(tokens::Ge), |
| /// The `>` operator (greater than) |
| Gt(tokens::Gt), |
| /// The `+=` operator |
| AddEq(tokens::AddEq), |
| /// The `-=` operator |
| SubEq(tokens::SubEq), |
| /// The `*=` operator |
| MulEq(tokens::MulEq), |
| /// The `/=` operator |
| DivEq(tokens::DivEq), |
| /// The `%=` operator |
| RemEq(tokens::RemEq), |
| /// The `^=` operator |
| BitXorEq(tokens::CaretEq), |
| /// The `&=` operator |
| BitAndEq(tokens::AndEq), |
| /// The `|=` operator |
| BitOrEq(tokens::OrEq), |
| /// The `<<=` operator |
| ShlEq(tokens::ShlEq), |
| /// The `>>=` operator |
| ShrEq(tokens::ShrEq), |
| } |
| } |
| |
| ast_enum! { |
| #[cfg_attr(feature = "clone-impls", derive(Copy))] |
| pub enum UnOp { |
| /// The `*` operator for dereferencing |
| Deref(tokens::Star), |
| /// The `!` operator for logical inversion |
| Not(tokens::Bang), |
| /// The `-` operator for negation |
| 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), |
| } |
| } |
| } |
| } |