feat(parser): parse binary operations in Midas

This commit is contained in:
2026-07-01 14:07:06 +02:00
parent a017a8cf1f
commit 1ea5da7024
4 changed files with 27 additions and 5 deletions

View File

@@ -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__",

View File

@@ -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 "*":

View File

@@ -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()

View File

@@ -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)