From 4d23e8840e0a4abdd341d0bd5737f470820a1c11 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 25 May 2026 22:06:18 +0200 Subject: [PATCH] feat(parser): adapt AST printer with new nodes --- midas/ast/printer.py | 105 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/midas/ast/printer.py b/midas/ast/printer.py index 2d38241..f467a85 100644 --- a/midas/ast/printer.py +++ b/midas/ast/printer.py @@ -350,7 +350,12 @@ class MidasPrinter(m.Expr.Visitor[str], m.Stmt.Visitor[str]): return f"{expr.name.lexeme}{template}{'?' if expr.optional else ''}" -class PythonAstPrinter(AstPrinter, p.MidasType.Visitor[None], p.Stmt.Visitor[None]): +class PythonAstPrinter( + AstPrinter, + p.MidasType.Visitor[None], + p.Stmt.Visitor[None], + p.Expr.Visitor[None], +): def visit_base_type(self, node: p.BaseType) -> None: self._write_line("BaseType") with self._child_level(): @@ -382,6 +387,9 @@ class PythonAstPrinter(AstPrinter, p.MidasType.Visitor[None], p.Stmt.Visitor[Non self._mark_last() col.accept(self) + def visit_expression_stmt(self, stmt: p.ExpressionStmt) -> None: + stmt.expr.accept(self) + def visit_function(self, stmt: p.Function) -> None: self._write_line("Function") with self._child_level(): @@ -418,3 +426,98 @@ class PythonAstPrinter(AstPrinter, p.MidasType.Visitor[None], p.Stmt.Visitor[Non with self._child_level(): self._write_line(f"name: {arg.name}") self._write_optional_child("type", arg.type, last=True) + + def visit_type_assign(self, stmt: p.TypeAssign) -> None: + self._write_line("TypeAssign") + with self._child_level(): + self._write_line(f"name: {stmt.name}") + self._write_line("type", last=True) + with self._child_level(single=True): + stmt.type.accept(self) + + def visit_assign_expr(self, expr: p.AssignExpr) -> None: + self._write_line("AssignExpr") + with self._child_level(): + self._write_line(f"name: {expr.name}") + self._write_line("value", last=True) + with self._child_level(single=True): + expr.value.accept(self) + + def visit_binary_expr(self, expr: p.BinaryExpr) -> None: + self._write_line("BinaryExpr") + with self._child_level(): + self._write_line("left") + with self._child_level(single=True): + expr.left.accept(self) + + self._write_line(f"operator: {expr.operator.__class__.__name__}") + + self._write_line("right", last=True) + with self._child_level(single=True): + expr.right.accept(self) + + def visit_unary_expr(self, expr: p.UnaryExpr) -> None: + self._write_line("UnaryExpr") + with self._child_level(): + self._write_line(f"operator: {expr.operator.__class__.__name__}") + + self._write_line("right", last=True) + with self._child_level(single=True): + expr.right.accept(self) + + def visit_call_expr(self, expr: p.CallExpr) -> None: + self._write_line("CallExpr") + with self._child_level(): + self._write_line("callee") + with self._child_level(single=True): + expr.callee.accept(self) + + self._write_line("arguments", last=True) + with self._child_level(): + for i, arg in enumerate(expr.arguments): + self._idx = i + if i == len(expr.arguments) - 1: + self._mark_last() + arg.accept(self) + + def visit_get_expr(self, expr: p.GetExpr) -> None: + self._write_line("GetExpr") + with self._child_level(): + self._write_line("object") + with self._child_level(single=True): + expr.object.accept(self) + self._write_line(f"name: {expr.name}", last=True) + + def visit_literal_expr(self, expr: p.LiteralExpr) -> None: + self._write_line("LiteralExpr") + with self._child_level(single=True): + self._write_line(f"value: {expr.value}") + + def visit_variable_expr(self, expr: p.VariableExpr) -> None: + self._write_line("VariableExpr") + with self._child_level(single=True): + self._write_line(f"name: {expr.name}") + + def visit_logical_expr(self, expr: p.LogicalExpr) -> None: + self._write_line("LogicalExpr") + with self._child_level(): + self._write_line("left") + with self._child_level(single=True): + expr.left.accept(self) + + self._write_line(f"operator: {expr.operator.__class__.__name__}") + + self._write_line("right", last=True) + with self._child_level(single=True): + expr.right.accept(self) + + def visit_set_expr(self, expr: p.SetExpr) -> None: + self._write_line("SetExpr") + with self._child_level(): + self._write_line("object") + with self._child_level(single=True): + expr.object.accept(self) + self._write_line(f"name: {expr.name}") + self._write_line("value", last=True) + with self._child_level(single=True): + expr.value.accept(self)