Implement parenthesis grouping
This commit is contained in:
parent
807482583a
commit
26c36ed0ae
@ -7,6 +7,12 @@ pub enum Token {
|
|||||||
/// Integer literal (64-bit)
|
/// Integer literal (64-bit)
|
||||||
I64(i64),
|
I64(i64),
|
||||||
|
|
||||||
|
/// Left Parenthesis ('(')
|
||||||
|
LParen,
|
||||||
|
|
||||||
|
/// Right Parenthesis (')')
|
||||||
|
RParen,
|
||||||
|
|
||||||
/// Plus (+)
|
/// Plus (+)
|
||||||
Add,
|
Add,
|
||||||
|
|
||||||
@ -99,6 +105,8 @@ impl<'a> Lexer<'a> {
|
|||||||
'|' => tokens.push(Token::BOr),
|
'|' => tokens.push(Token::BOr),
|
||||||
'&' => tokens.push(Token::BAnd),
|
'&' => tokens.push(Token::BAnd),
|
||||||
'^' => tokens.push(Token::BXor),
|
'^' => tokens.push(Token::BXor),
|
||||||
|
'(' => tokens.push(Token::LParen),
|
||||||
|
')' => tokens.push(Token::RParen),
|
||||||
|
|
||||||
//TODO: Don't panic, keep calm
|
//TODO: Don't panic, keep calm
|
||||||
_ => panic!("Lexer encountered unexpected char: '{}'", ch),
|
_ => panic!("Lexer encountered unexpected char: '{}'", ch),
|
||||||
|
|||||||
@ -47,12 +47,12 @@ pub enum Ast {
|
|||||||
/*
|
/*
|
||||||
## Grammar
|
## Grammar
|
||||||
### Expressions
|
### Expressions
|
||||||
expr_primary = LITERAL
|
expr_primary = LITERAL | "(" expr ")"
|
||||||
expr_mul = expr_primary (("*" | "/" | "%") expr_primary)*
|
expr_mul = expr_primary (("*" | "/" | "%") expr_primary)*
|
||||||
expr_add = expr_mul (("+" | "-") expr_mul)*
|
expr_add = expr_mul (("+" | "-") expr_mul)*
|
||||||
expr_shift = expr_add ((">>" | "<<") expr_add)*
|
expr_shift = expr_add ((">>" | "<<") expr_add)*
|
||||||
expr_band = expr_shift ("&" expr_shift)*
|
expr_band = expr_shift ("&" expr_shift)*
|
||||||
expr_bxor = expr_band ("^") expr_band)*
|
expr_bxor = expr_band ("^" expr_band)*
|
||||||
expr_bor = expr_bxor ("|" expr_bxor)*
|
expr_bor = expr_bxor ("|" expr_bxor)*
|
||||||
expr = expr_bor
|
expr = expr_bor
|
||||||
*/
|
*/
|
||||||
@ -110,6 +110,17 @@ impl<T: Iterator<Item = Token>> Parser<T> {
|
|||||||
match self.next() {
|
match self.next() {
|
||||||
Token::I64(val) => Ast::I64(val),
|
Token::I64(val) => Ast::I64(val),
|
||||||
|
|
||||||
|
Token::LParen => {
|
||||||
|
let inner_expr = self.parse_expr();
|
||||||
|
|
||||||
|
// Verify that there is a closing parenthesis
|
||||||
|
if !matches!(self.next(), Token::RParen) {
|
||||||
|
panic!("Error parsing primary expr: Exepected closing parenthesis ')'");
|
||||||
|
}
|
||||||
|
|
||||||
|
inner_expr
|
||||||
|
}
|
||||||
|
|
||||||
tok => panic!("Error parsing primary expr: Unexpected Token '{:?}'", tok),
|
tok => panic!("Error parsing primary expr: Unexpected Token '{:?}'", tok),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user