feat(parser): parse binary operations in Midas
This commit is contained in:
@@ -41,7 +41,7 @@ PY_UNARY_METHODS: dict[Type[ast.unaryop], str] = {
|
|||||||
|
|
||||||
|
|
||||||
MIDAS_BINARY_METHODS: dict[TokenType, str] = {
|
MIDAS_BINARY_METHODS: dict[TokenType, str] = {
|
||||||
# TokenType.PLUS: "__add__",
|
TokenType.PLUS: "__add__",
|
||||||
TokenType.MINUS: "__sub__",
|
TokenType.MINUS: "__sub__",
|
||||||
TokenType.STAR: "__mul__",
|
TokenType.STAR: "__mul__",
|
||||||
TokenType.SLASH: "__truediv__",
|
TokenType.SLASH: "__truediv__",
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ class MidasLexer(Lexer):
|
|||||||
self.add_token(TokenType.UNDERSCORE)
|
self.add_token(TokenType.UNDERSCORE)
|
||||||
case "-" if self.match(">"):
|
case "-" if self.match(">"):
|
||||||
self.add_token(TokenType.ARROW)
|
self.add_token(TokenType.ARROW)
|
||||||
# case "+":
|
case "+":
|
||||||
# self.add_token(TokenType.PLUS)
|
self.add_token(TokenType.PLUS)
|
||||||
case "-":
|
case "-":
|
||||||
self.add_token(TokenType.MINUS)
|
self.add_token(TokenType.MINUS)
|
||||||
case "*":
|
case "*":
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class TokenType(Enum):
|
|||||||
DOT = auto()
|
DOT = auto()
|
||||||
|
|
||||||
# Operators
|
# Operators
|
||||||
# PLUS = auto()
|
PLUS = auto()
|
||||||
MINUS = auto()
|
MINUS = auto()
|
||||||
STAR = auto()
|
STAR = auto()
|
||||||
SLASH = auto()
|
SLASH = auto()
|
||||||
|
|||||||
@@ -361,13 +361,35 @@ class MidasParser(Parser):
|
|||||||
Returns:
|
Returns:
|
||||||
Expr: the parsed expression
|
Expr: the parsed expression
|
||||||
"""
|
"""
|
||||||
expr: Expr = self.unary()
|
expr: Expr = self.term()
|
||||||
while self.match(
|
while self.match(
|
||||||
TokenType.LESS,
|
TokenType.LESS,
|
||||||
TokenType.LESS_EQUAL,
|
TokenType.LESS_EQUAL,
|
||||||
TokenType.GREATER,
|
TokenType.GREATER,
|
||||||
TokenType.GREATER_EQUAL,
|
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()
|
operator: Token = self.previous()
|
||||||
right: Expr = self.unary()
|
right: Expr = self.unary()
|
||||||
location: Location = Location.span(expr.location, right.location)
|
location: Location = Location.span(expr.location, right.location)
|
||||||
|
|||||||
Reference in New Issue
Block a user