refactor
This commit is contained in:
parent
ba6f572d6b
commit
8d910725e3
1 changed files with 36 additions and 42 deletions
78
src/main.rs
78
src/main.rs
|
@ -2,7 +2,7 @@ use std::io;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
enum Symbol {
|
enum Symbol {
|
||||||
Number { value: u64 },
|
Number(i64),
|
||||||
LeftBracket,
|
LeftBracket,
|
||||||
RightBracket,
|
RightBracket,
|
||||||
Add,
|
Add,
|
||||||
|
@ -96,31 +96,11 @@ fn try_tokenizing() {
|
||||||
let tokenized_input: Vec<Vec<Symbol>> = input.iter().map(|s| tokenize(s).unwrap()).collect();
|
let tokenized_input: Vec<Vec<Symbol>> = input.iter().map(|s| tokenize(s).unwrap()).collect();
|
||||||
|
|
||||||
let result: Vec<Vec<Symbol>> = vec![
|
let result: Vec<Vec<Symbol>> = vec![
|
||||||
vec![
|
vec![Symbol::Number(1), Symbol::Add, Symbol::Number(2)],
|
||||||
Symbol::Number { value: 1 },
|
vec![Symbol::Number(3), Symbol::Sub, Symbol::Number(4)],
|
||||||
Symbol::Add,
|
vec![Symbol::Number(5), Symbol::Mul, Symbol::Number(6)],
|
||||||
Symbol::Number { value: 2 },
|
vec![Symbol::Number(7), Symbol::Div, Symbol::Number(8)],
|
||||||
],
|
vec![Symbol::Number(8), Symbol::Exp, Symbol::Number(9)],
|
||||||
vec![
|
|
||||||
Symbol::Number { value: 3 },
|
|
||||||
Symbol::Sub,
|
|
||||||
Symbol::Number { value: 4 },
|
|
||||||
],
|
|
||||||
vec![
|
|
||||||
Symbol::Number { value: 5 },
|
|
||||||
Symbol::Mul,
|
|
||||||
Symbol::Number { value: 6 },
|
|
||||||
],
|
|
||||||
vec![
|
|
||||||
Symbol::Number { value: 7 },
|
|
||||||
Symbol::Div,
|
|
||||||
Symbol::Number { value: 8 },
|
|
||||||
],
|
|
||||||
vec![
|
|
||||||
Symbol::Number { value: 8 },
|
|
||||||
Symbol::Exp,
|
|
||||||
Symbol::Number { value: 9 },
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
assert!(tokenized_input == result);
|
assert!(tokenized_input == result);
|
||||||
}
|
}
|
||||||
|
@ -131,11 +111,10 @@ fn tokenize(input: &str) -> Result<Vec<Symbol>, ParseError> {
|
||||||
|
|
||||||
for (i, c) in input.chars().enumerate() {
|
for (i, c) in input.chars().enumerate() {
|
||||||
if !c.is_ascii_digit() && !acc.is_empty() {
|
if !c.is_ascii_digit() && !acc.is_empty() {
|
||||||
tokens.push(Symbol::Number {
|
tokens.push(Symbol::Number(
|
||||||
value: acc
|
acc.parse()
|
||||||
.parse()
|
|
||||||
.map_err(|_| ParseError::WrongTokenError { pos: 1 })?,
|
.map_err(|_| ParseError::WrongTokenError { pos: 1 })?,
|
||||||
});
|
));
|
||||||
acc.clear();
|
acc.clear();
|
||||||
};
|
};
|
||||||
match c {
|
match c {
|
||||||
|
@ -156,12 +135,11 @@ fn tokenize(input: &str) -> Result<Vec<Symbol>, ParseError> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !acc.is_empty() {
|
if !acc.is_empty() {
|
||||||
tokens.push(Symbol::Number {
|
tokens.push(Symbol::Number(
|
||||||
value: acc
|
acc.parse()
|
||||||
.parse()
|
.map_err(|_| ParseError::WrongTokenError { pos: 5 })?,
|
||||||
.map_err(|_| ParseError::WrongTokenError { pos: 1 })?,
|
));
|
||||||
});
|
};
|
||||||
}
|
|
||||||
|
|
||||||
Ok(tokens)
|
Ok(tokens)
|
||||||
}
|
}
|
||||||
|
@ -175,22 +153,28 @@ fn ast(input: Vec<Symbol>) -> Result<Node, ParseError> {
|
||||||
while i < length {
|
while i < length {
|
||||||
let s = &input[i];
|
let s = &input[i];
|
||||||
match s {
|
match s {
|
||||||
Symbol::Number { value } => {
|
Symbol::Number(value) => {
|
||||||
stack.push(Node::Number { value: *value });
|
// stack.push(Node::Number { value: *value });
|
||||||
}
|
}
|
||||||
Symbol::Add => {
|
Symbol::Add => {
|
||||||
let left = stack.pop();
|
// let left = stack.pop();
|
||||||
// increment
|
// increment
|
||||||
|
let left = input.get(i - 1);
|
||||||
let right = input.get(i + 1);
|
let right = input.get(i + 1);
|
||||||
i += 1;
|
i += 1;
|
||||||
|
|
||||||
|
if let Some(l) = left {
|
||||||
|
if let Some(r) = right {
|
||||||
|
if let Symbol::Number(v1) = l {}
|
||||||
|
}
|
||||||
|
}
|
||||||
match (left, right) {
|
match (left, right) {
|
||||||
(Some(left), Some(right)) => {
|
(Some(left), Some(right)) => {
|
||||||
match right {
|
match right {
|
||||||
Symbol::Number { value } => {
|
Symbol::Number(right) => {
|
||||||
stack.push(Node::Add {
|
stack.push(Node::Add {
|
||||||
left: (Box::new(left)),
|
left: (Box::new(Node::Number(left))),
|
||||||
right: (Box::new(Node::Number { value: *value })),
|
right: (Box::new(Node::Number(right))),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_ => return Err(ParseError::WrongTokenError { pos: 1 }),
|
_ => return Err(ParseError::WrongTokenError { pos: 1 }),
|
||||||
|
@ -216,3 +200,13 @@ fn ast(input: Vec<Symbol>) -> Result<Node, ParseError> {
|
||||||
}
|
}
|
||||||
Ok(stack[0].clone())
|
Ok(stack[0].clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn push_to_ast(s: &Symbol, stack: &mut Vec<Node>, input: &mut Vec<Symbol>, index: usize) {
|
||||||
|
let left = stack.pop();
|
||||||
|
// increment
|
||||||
|
let right = input.get(index + 1);
|
||||||
|
match s {
|
||||||
|
Symbol::Add => {}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue