(&mut self)
| 947 | } |
| 948 | |
| 949 | fn parse_expr(&mut self) -> Result<Expr> { |
| 950 | let pos = self.pos(); |
| 951 | if self.is_lparen() { |
| 952 | self.expect_lparen()?; |
| 953 | let ret = self.parse_expr_inner_parens(pos)?; |
| 954 | self.expect_rparen()?; |
| 955 | Ok(ret) |
| 956 | } else if self.is_const() { |
| 957 | let val = self.parse_const()?; |
| 958 | Ok(Expr::ConstPrim { val, pos }) |
| 959 | } else if self.eat_sym_str("true")? { |
| 960 | Ok(Expr::ConstBool { val: true, pos }) |
| 961 | } else if self.eat_sym_str("false")? { |
| 962 | Ok(Expr::ConstBool { val: false, pos }) |
| 963 | } else if self.is_sym() { |
| 964 | let name = self.parse_ident()?; |
| 965 | Ok(Expr::Var { name, pos }) |
| 966 | } else if self.is_int() { |
| 967 | let val = self.expect_int()?; |
| 968 | Ok(Expr::ConstInt { val, pos }) |
| 969 | } else { |
| 970 | Err(self.error(pos, "Invalid expression".into())) |
| 971 | } |
| 972 | } |
| 973 | |
| 974 | fn parse_expr_inner_parens(&mut self, pos: Pos) -> Result<Expr> { |
| 975 | if self.eat_sym_str("let")? { |
no test coverage detected