|
|
@ -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 |
|
|
|