diff --git a/midas/checker/operators.py b/midas/checker/operators.py index f9354a0..c5bb763 100644 --- a/midas/checker/operators.py +++ b/midas/checker/operators.py @@ -41,7 +41,7 @@ PY_UNARY_METHODS: dict[Type[ast.unaryop], str] = { MIDAS_BINARY_METHODS: dict[TokenType, str] = { - # TokenType.PLUS: "__add__", + TokenType.PLUS: "__add__", TokenType.MINUS: "__sub__", TokenType.STAR: "__mul__", TokenType.SLASH: "__truediv__", diff --git a/midas/lexer/midas.py b/midas/lexer/midas.py index 0510a6e..a530b47 100644 --- a/midas/lexer/midas.py +++ b/midas/lexer/midas.py @@ -46,8 +46,8 @@ class MidasLexer(Lexer): self.add_token(TokenType.UNDERSCORE) case "-" if self.match(">"): self.add_token(TokenType.ARROW) - # case "+": - # self.add_token(TokenType.PLUS) + case "+": + self.add_token(TokenType.PLUS) case "-": self.add_token(TokenType.MINUS) case "*": diff --git a/midas/lexer/token.py b/midas/lexer/token.py index f1d4047..f06c21e 100644 --- a/midas/lexer/token.py +++ b/midas/lexer/token.py @@ -25,7 +25,7 @@ class TokenType(Enum): DOT = auto() # Operators - # PLUS = auto() + PLUS = auto() MINUS = auto() STAR = auto() SLASH = auto() diff --git a/midas/parser/midas.py b/midas/parser/midas.py index 3bcee32..534f95e 100644 --- a/midas/parser/midas.py +++ b/midas/parser/midas.py @@ -361,13 +361,35 @@ class MidasParser(Parser): Returns: Expr: the parsed expression """ - expr: Expr = self.unary() + expr: Expr = self.term() while self.match( TokenType.LESS, TokenType.LESS_EQUAL, TokenType.GREATER, TokenType.GREATER_EQUAL, ): + operator: Token = self.previous() + right: Expr = self.term() + location: Location = Location.span(expr.location, right.location) + expr = BinaryExpr( + location=location, left=expr, operator=operator, right=right + ) + return expr + + def term(self) -> Expr: + expr: Expr = self.factor() + while self.match(TokenType.PLUS, TokenType.MINUS): + operator: Token = self.previous() + right: Expr = self.factor() + location: Location = Location.span(expr.location, right.location) + expr = BinaryExpr( + location=location, left=expr, operator=operator, right=right + ) + return expr + + def factor(self) -> Expr: + expr: Expr = self.unary() + while self.match(TokenType.STAR, TokenType.SLASH): operator: Token = self.previous() right: Expr = self.unary() location: Location = Location.span(expr.location, right.location)