fix(parser): fix many bugs in parser
fixed bugs relating to parsing order and unreliable token advancement for parenthesis
This commit is contained in:
2 files changed
+7
-6
No files matched your search
+6
-6
@@ -48,7 +48,7 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_multiplicative(&mut self) -> Expression {
|
fn parse_multiplicative(&mut self) -> Expression {
|
||||||
let mut left = self.parse_primary();
|
let mut left = self.parse_exponential();
|
||||||
|
|
||||||
while let Some(token) = self.tokens.get(self.position) {
|
while let Some(token) = self.tokens.get(self.position) {
|
||||||
match token {
|
match token {
|
||||||
@@ -73,7 +73,6 @@ impl Parser {
|
|||||||
let right = self.parse_group();
|
let right = self.parse_group();
|
||||||
left =
|
left =
|
||||||
Expression::Operation(Operator::Multiply, Box::new(left), Box::new(right));
|
Expression::Operation(Operator::Multiply, Box::new(left), Box::new(right));
|
||||||
self.position += 1;
|
|
||||||
}
|
}
|
||||||
Token::Identifier(_) => {
|
Token::Identifier(_) => {
|
||||||
let right = self.parse_primary();
|
let right = self.parse_primary();
|
||||||
@@ -88,15 +87,14 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_exponential(&mut self) -> Expression {
|
fn parse_exponential(&mut self) -> Expression {
|
||||||
let mut left = self.parse_primary();
|
let mut left = self.parse_group();
|
||||||
|
|
||||||
while let Some(token) = self.tokens.get(self.position) {
|
while let Some(token) = self.tokens.get(self.position) {
|
||||||
match token {
|
match token {
|
||||||
Token::Operator(Operator::Power) => {
|
Token::Operator(Operator::Power) => {
|
||||||
self.position += 1;
|
self.position += 1;
|
||||||
let right = self.parse_group();
|
let right = self.parse_group();
|
||||||
left =
|
left = Expression::Operation(Operator::Power, Box::new(left), Box::new(right));
|
||||||
Expression::Operation(Operator::Multiply, Box::new(left), Box::new(right));
|
|
||||||
}
|
}
|
||||||
_ => break,
|
_ => break,
|
||||||
}
|
}
|
||||||
@@ -109,7 +107,9 @@ impl Parser {
|
|||||||
match self.tokens.get(self.position).expect("expected token!") {
|
match self.tokens.get(self.position).expect("expected token!") {
|
||||||
Token::OpenParen => {
|
Token::OpenParen => {
|
||||||
self.position += 1;
|
self.position += 1;
|
||||||
self.parse_additive()
|
let expression = self.parse_additive();
|
||||||
|
self.position += 1;
|
||||||
|
expression
|
||||||
}
|
}
|
||||||
_ => self.parse_primary(),
|
_ => self.parse_primary(),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user