mirror of https://github.com/rm-dr/daisy
Added more token methods
parent
cea5a1db22
commit
d0d051d616
|
@ -40,7 +40,6 @@ pub enum Token {
|
||||||
Number(LineLocation, f64),
|
Number(LineLocation, f64),
|
||||||
Constant(LineLocation, f64, String),
|
Constant(LineLocation, f64, String),
|
||||||
|
|
||||||
Root(VecDeque<Token>),
|
|
||||||
Multiply(VecDeque<Token>),
|
Multiply(VecDeque<Token>),
|
||||||
Divide(VecDeque<Token>),
|
Divide(VecDeque<Token>),
|
||||||
Add(VecDeque<Token>),
|
Add(VecDeque<Token>),
|
||||||
|
@ -52,6 +51,42 @@ pub enum Token {
|
||||||
|
|
||||||
impl Token {
|
impl Token {
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn get_args(&mut self) -> Option<&mut VecDeque<Token>> {
|
||||||
|
match self {
|
||||||
|
Token::Multiply(ref mut v)
|
||||||
|
| Token::Divide(ref mut v)
|
||||||
|
| Token::Add(ref mut v)
|
||||||
|
| Token::Factorial(ref mut v)
|
||||||
|
| Token::Negative(ref mut v)
|
||||||
|
| Token::Power(ref mut v)
|
||||||
|
| Token::Modulo(ref mut v)
|
||||||
|
=> Some(v),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn get_line_location(&self) -> &LineLocation {
|
||||||
|
match self {
|
||||||
|
Token::PreNumber(l, _) |
|
||||||
|
Token::PreWord(l, _) |
|
||||||
|
Token::PreOperator(l, _) |
|
||||||
|
Token::PreGroupStart(l) |
|
||||||
|
Token::PreGroupEnd(l) |
|
||||||
|
Token::PreGroup(l, _)
|
||||||
|
=> l,
|
||||||
|
|
||||||
|
// These have a line location, but we shouldn't ever need to get it.
|
||||||
|
Token::Number(_l, _) |
|
||||||
|
Token::Constant(_l, _, _)
|
||||||
|
=> panic!(),
|
||||||
|
|
||||||
|
|
||||||
|
_ => panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn as_number(&self) -> Token {
|
fn as_number(&self) -> Token {
|
||||||
match self {
|
match self {
|
||||||
|
|
|
@ -9,17 +9,7 @@ fn get_at_coords<'a>(g: &'a mut Token, coords: &Vec<usize>) -> &'a mut Token {
|
||||||
let mut h = &mut *g;
|
let mut h = &mut *g;
|
||||||
|
|
||||||
for t in coords.iter() {
|
for t in coords.iter() {
|
||||||
let inner = match h {
|
let inner = h.get_args().unwrap();
|
||||||
Token::Multiply(ref mut v) => v,
|
|
||||||
Token::Divide(ref mut v) => v,
|
|
||||||
Token::Add(ref mut v) => v,
|
|
||||||
Token::Factorial(ref mut v) => v,
|
|
||||||
Token::Negative(ref mut v) => v,
|
|
||||||
Token::Power(ref mut v) => v,
|
|
||||||
Token::Modulo(ref mut v) => v,
|
|
||||||
_ => panic!()
|
|
||||||
};
|
|
||||||
|
|
||||||
h = &mut inner[*t];
|
h = &mut inner[*t];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,17 +27,7 @@ pub fn p_evaluate(
|
||||||
|
|
||||||
let mut h = &mut g;
|
let mut h = &mut g;
|
||||||
for t in coords.iter() {
|
for t in coords.iter() {
|
||||||
let inner: Option<&mut VecDeque<Token>> = match h {
|
let inner = h.get_args();
|
||||||
Token::Multiply(ref mut v)
|
|
||||||
| Token::Divide(ref mut v)
|
|
||||||
| Token::Add(ref mut v)
|
|
||||||
| Token::Factorial(ref mut v)
|
|
||||||
| Token::Negative(ref mut v)
|
|
||||||
| Token::Power(ref mut v)
|
|
||||||
| Token::Modulo(ref mut v)
|
|
||||||
=> Some(v),
|
|
||||||
_ => None
|
|
||||||
};
|
|
||||||
|
|
||||||
if inner.is_none() || *t >= inner.as_ref().unwrap().len() {
|
if inner.is_none() || *t >= inner.as_ref().unwrap().len() {
|
||||||
coords.pop();
|
coords.pop();
|
||||||
|
|
|
@ -5,18 +5,6 @@ use crate::parser::LineLocation;
|
||||||
use crate::parser::ParserError;
|
use crate::parser::ParserError;
|
||||||
use crate::parser::Operator;
|
use crate::parser::Operator;
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
fn get_line_location(t: &Token) -> &LineLocation {
|
|
||||||
match t {
|
|
||||||
Token::PreNumber(l, _) |
|
|
||||||
Token::PreWord(l, _) |
|
|
||||||
Token::PreOperator(l, _) |
|
|
||||||
Token::PreGroup(l, _)
|
|
||||||
=> l,
|
|
||||||
_ => panic!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn select_op(k: Operator, mut new_token_args: VecDeque<Token>) -> Token {
|
fn select_op(k: Operator, mut new_token_args: VecDeque<Token>) -> Token {
|
||||||
match k {
|
match k {
|
||||||
|
@ -87,7 +75,7 @@ fn treeify_binary(
|
||||||
=> {
|
=> {
|
||||||
// Binary and right-unary operators cannot
|
// Binary and right-unary operators cannot
|
||||||
// follow a binary operator.
|
// follow a binary operator.
|
||||||
let LineLocation { pos: posa, .. } = *get_line_location(&this);
|
let LineLocation { pos: posa, .. } = *this.get_line_location();
|
||||||
let LineLocation { pos: posb, len: lenb } = *l;
|
let LineLocation { pos: posb, len: lenb } = *l;
|
||||||
return Err((
|
return Err((
|
||||||
LineLocation{pos: posa, len: posb - posa + lenb},
|
LineLocation{pos: posa, len: posb - posa + lenb},
|
||||||
|
@ -184,7 +172,7 @@ fn treeify_unaryleft(
|
||||||
=> {
|
=> {
|
||||||
// Binary and right-unary operators cannot
|
// Binary and right-unary operators cannot
|
||||||
// follow a binary operator.
|
// follow a binary operator.
|
||||||
let LineLocation { pos: posa, .. } = *get_line_location(&this);
|
let LineLocation { pos: posa, .. } = *this.get_line_location();
|
||||||
let LineLocation { pos: posb, len: lenb } = *l;
|
let LineLocation { pos: posb, len: lenb } = *l;
|
||||||
return Err((
|
return Err((
|
||||||
LineLocation{pos: posa, len: posb - posa + lenb},
|
LineLocation{pos: posa, len: posb - posa + lenb},
|
||||||
|
@ -273,7 +261,7 @@ fn treeify_unaryright(
|
||||||
match o {
|
match o {
|
||||||
// Left unary operators
|
// Left unary operators
|
||||||
Operator::Negative => {
|
Operator::Negative => {
|
||||||
let LineLocation { pos: posa, .. } = *get_line_location(&this);
|
let LineLocation { pos: posa, .. } = *this.get_line_location();
|
||||||
let LineLocation { pos: posb, len: lenb } = *l;
|
let LineLocation { pos: posb, len: lenb } = *l;
|
||||||
return Err((
|
return Err((
|
||||||
LineLocation{pos: posa, len: posb - posa + lenb},
|
LineLocation{pos: posa, len: posb - posa + lenb},
|
||||||
|
@ -284,14 +272,14 @@ fn treeify_unaryright(
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return Err((
|
return Err((
|
||||||
*get_line_location(&this),
|
*this.get_line_location(),
|
||||||
ParserError::Syntax
|
ParserError::Syntax
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Token::PreOperator(l, _) = left {
|
if let Token::PreOperator(l, _) = left {
|
||||||
let LineLocation { pos: posa, .. } = *get_line_location(&this);
|
let LineLocation { pos: posa, .. } = *this.get_line_location();
|
||||||
let LineLocation { pos: posb, len: lenb } = *l;
|
let LineLocation { pos: posb, len: lenb } = *l;
|
||||||
return Err((
|
return Err((
|
||||||
LineLocation{pos: posa, len: posb - posa + lenb},
|
LineLocation{pos: posa, len: posb - posa + lenb},
|
||||||
|
|
Loading…
Reference in New Issue