feat(parser): add dictionary expression

This commit is contained in:
2026-06-16 20:35:39 +02:00
parent 5ce3b4abed
commit 42c2d7a098
5 changed files with 57 additions and 0 deletions

View File

@@ -157,6 +157,11 @@ class ListExpr:
items: list[Expr] items: list[Expr]
class DictExpr:
keys: list[Optional[Expr]]
values: list[Expr]
class SubscriptExpr: class SubscriptExpr:
object: Expr object: Expr
index: Expr index: Expr

View File

@@ -745,6 +745,27 @@ class PythonAstPrinter(
self._mark_last() self._mark_last()
item.accept(self) item.accept(self)
def visit_dict_expr(self, expr: p.DictExpr) -> None:
self._write_line("DictExpr")
with self._child_level():
self._write_line("keys")
with self._child_level():
for i, key in enumerate(expr.keys):
self._idx = i
if i == len(expr.keys) - 1:
self._mark_last()
if key is None:
self._write_line("None")
else:
key.accept(self)
self._write_line("values", last=True)
with self._child_level():
for i, value in enumerate(expr.values):
self._idx = i
if i == len(expr.values) - 1:
self._mark_last()
value.accept(self)
def visit_subscript_expr(self, expr: p.SubscriptExpr) -> None: def visit_subscript_expr(self, expr: p.SubscriptExpr) -> None:
self._write_line("SubscriptExpr") self._write_line("SubscriptExpr")
with self._child_level(): with self._child_level():

View File

@@ -259,6 +259,9 @@ class Expr(ABC):
@abstractmethod @abstractmethod
def visit_list_expr(self, expr: ListExpr) -> T: ... def visit_list_expr(self, expr: ListExpr) -> T: ...
@abstractmethod
def visit_dict_expr(self, expr: DictExpr) -> T: ...
@abstractmethod @abstractmethod
def visit_subscript_expr(self, expr: SubscriptExpr) -> T: ... def visit_subscript_expr(self, expr: SubscriptExpr) -> T: ...
@@ -370,6 +373,15 @@ class ListExpr(Expr):
return visitor.visit_list_expr(self) return visitor.visit_list_expr(self)
@dataclass(frozen=True)
class DictExpr(Expr):
keys: list[Optional[Expr]]
values: list[Expr]
def accept(self, visitor: Expr.Visitor[T]) -> T:
return visitor.visit_dict_expr(self)
@dataclass(frozen=True) @dataclass(frozen=True)
class SubscriptExpr(Expr): class SubscriptExpr(Expr):
object: Expr object: Expr

View File

@@ -10,6 +10,7 @@ from midas.ast.python import (
CastExpr, CastExpr,
CompareExpr, CompareExpr,
ConstraintType, ConstraintType,
DictExpr,
Expr, Expr,
ExpressionStmt, ExpressionStmt,
ForStmt, ForStmt,
@@ -447,6 +448,16 @@ class PythonParser:
items=[self.parse_expr(item) for item in items], items=[self.parse_expr(item) for item in items],
) )
case ast.Dict(keys=keys, values=values):
return DictExpr(
location=location,
keys=[
self.parse_expr(key) if key is not None else None
for key in keys
],
values=[self.parse_expr(value) for value in values],
)
case ast.Subscript(value=value, slice=index): case ast.Subscript(value=value, slice=index):
return SubscriptExpr( return SubscriptExpr(
location=location, location=location,

View File

@@ -9,6 +9,7 @@ from midas.ast.python import (
CastExpr, CastExpr,
CompareExpr, CompareExpr,
ConstraintType, ConstraintType,
DictExpr,
Expr, Expr,
ExpressionStmt, ExpressionStmt,
ForStmt, ForStmt,
@@ -278,6 +279,13 @@ class PythonAstJsonSerializer(
"items": [item.accept(self) for item in expr.items], "items": [item.accept(self) for item in expr.items],
} }
def visit_dict_expr(self, expr: DictExpr) -> dict:
return {
"_type": "DictExpr",
"keys": [self._serialize_optional(key) for key in expr.keys],
"values": self._serialize_list(expr.values),
}
def visit_subscript_expr(self, expr: SubscriptExpr) -> dict: def visit_subscript_expr(self, expr: SubscriptExpr) -> dict:
return { return {
"_type": "SubscriptExpr", "_type": "SubscriptExpr",