Browse Source

added op! and vop!

pull/1/head
Jason Williams 6 years ago
parent
commit
0e0e54b604
  1. 49
      src/lib/syntax/lexer.rs

49
src/lib/syntax/lexer.rs

@ -9,16 +9,49 @@ use syntax::ast::token::{Token, TokenData};
#[allow(unused)] #[allow(unused)]
macro_rules! vop { macro_rules! vop {
($this:ident, $assign_op:expr, $op:expr) => { ($this:ident, $assign_op:expr, $op:expr) => ({
let preview = $this.preview_next()?; let preview = $this.preview_next()?;
match preview { match preview {
'=' => { '=' => {
$this.next()?; $this.next()?;
$assign_op; $assign_op
} }
_ => $op, _ => $op,
} }
}; });
($this:ident, $assign_op:expr, $op:expr, {$($case:pat => $block:expr), +}) => ({
let preview = $this.preview_next()?;
match preview {
'=' => {
$this.next()?;
$assign_op
},
$($case => $block)+,
_ => $op
}
});
($this:ident, $op:expr, {$($case:pat => $block:expr),+}) => {
let preview = $this.preview_next()?;
match preview {
$($case => $block) +,
_ => $op
}
}
}
macro_rules! op {
($this:ident, $assign_op:expr, $op:expr) => ({
let punc = vop!($this, $assign_op, $op);
$this.push_punc(punc);
});
($this:ident, $assign_op:expr, $op:expr, {$($case:pat => $block:expr),+}) => ({
let punc = vop!($this, $assign_op, $op, {$($case => $block),+});
$this.push_punc(punc);
});
($this:ident, $op:expr, {$($case:pat => $block:expr),+}) => ({
let punc = vop!($this, $op, {$($case => $block),+});
$this.push_punc();
});
} }
// Defining an error type // Defining an error type
@ -287,6 +320,7 @@ impl<'a> Lexer<'a> {
'[' => self.push_punc(Punctuator::OpenBracket), '[' => self.push_punc(Punctuator::OpenBracket),
']' => self.push_punc(Punctuator::CloseBracket), ']' => self.push_punc(Punctuator::CloseBracket),
'?' => self.push_punc(Punctuator::Question), '?' => self.push_punc(Punctuator::Question),
// Comments
'/' => { '/' => {
let token = match self.preview_next()? { let token = match self.preview_next()? {
// Matched comment // Matched comment
@ -315,6 +349,15 @@ impl<'a> Lexer<'a> {
}; };
self.push_token(token) self.push_token(token)
} }
'*' => op!(self, Punctuator::AssignMul, Punctuator::Mul),
'+' => op!(self, Punctuator::AssignAdd, Punctuator::Add, {
'+' => Punctuator::Inc
}),
'%' => op!(self, Punctuator::AssignMod, Punctuator::Mod),
'|' => op!(self, Punctuator::AssignOr, Punctuator::Or, {
'|' => Punctuator::BoolOr
}),
ch => panic!( ch => panic!(
"{}:{}: Unexpected '{}'", "{}:{}: Unexpected '{}'",
self.line_number, self.column_number, ch self.line_number, self.column_number, ch

Loading…
Cancel
Save