feat(parser): add more nodes for constraint parsing
This commit is contained in:
@@ -47,7 +47,7 @@ class Stmt(ABC):
|
|||||||
class SimpleTypeStmt(Stmt):
|
class SimpleTypeStmt(Stmt):
|
||||||
name: Token
|
name: Token
|
||||||
template: Optional[TemplateExpr]
|
template: Optional[TemplateExpr]
|
||||||
base: SimpleTypeExpr
|
base: TypeExpr
|
||||||
constraint: Optional[Expr]
|
constraint: Optional[Expr]
|
||||||
|
|
||||||
def accept(self, visitor: Stmt.Visitor[T]) -> T:
|
def accept(self, visitor: Stmt.Visitor[T]) -> T:
|
||||||
@@ -68,6 +68,7 @@ class ComplexTypeStmt(Stmt):
|
|||||||
class PropertyStmt(Stmt):
|
class PropertyStmt(Stmt):
|
||||||
name: Token
|
name: Token
|
||||||
type: TypeExpr
|
type: TypeExpr
|
||||||
|
constraint: Optional[Expr]
|
||||||
|
|
||||||
def accept(self, visitor: Stmt.Visitor[T]) -> T:
|
def accept(self, visitor: Stmt.Visitor[T]) -> T:
|
||||||
return visitor.visit_property_stmt(self)
|
return visitor.visit_property_stmt(self)
|
||||||
@@ -117,12 +118,24 @@ class Expr(ABC):
|
|||||||
@abstractmethod
|
@abstractmethod
|
||||||
def visit_simple_type_expr(self, expr: SimpleTypeExpr) -> T: ...
|
def visit_simple_type_expr(self, expr: SimpleTypeExpr) -> T: ...
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def visit_logical_expr(self, expr: LogicalExpr) -> T: ...
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def visit_binary_expr(self, expr: BinaryExpr) -> T: ...
|
def visit_binary_expr(self, expr: BinaryExpr) -> T: ...
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def visit_unary_expr(self, expr: UnaryExpr) -> T: ...
|
def visit_unary_expr(self, expr: UnaryExpr) -> T: ...
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def visit_get_expr(self, expr: GetExpr) -> T: ...
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def visit_variable_expr(self, expr: VariableExpr) -> T: ...
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def visit_grouping_expr(self, expr: GroupingExpr) -> T: ...
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def visit_literal_expr(self, expr: LiteralExpr) -> T: ...
|
def visit_literal_expr(self, expr: LiteralExpr) -> T: ...
|
||||||
|
|
||||||
@@ -145,6 +158,16 @@ class SimpleTypeExpr(Expr):
|
|||||||
return visitor.visit_simple_type_expr(self)
|
return visitor.visit_simple_type_expr(self)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class LogicalExpr(Expr):
|
||||||
|
left: Expr
|
||||||
|
operator: Token
|
||||||
|
right: Expr
|
||||||
|
|
||||||
|
def accept(self, visitor: Expr.Visitor[T]) -> T:
|
||||||
|
return visitor.visit_logical_expr(self)
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class BinaryExpr(Expr):
|
class BinaryExpr(Expr):
|
||||||
left: Expr
|
left: Expr
|
||||||
@@ -164,6 +187,31 @@ class UnaryExpr(Expr):
|
|||||||
return visitor.visit_unary_expr(self)
|
return visitor.visit_unary_expr(self)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class GetExpr(Expr):
|
||||||
|
expr: Expr
|
||||||
|
name: Token
|
||||||
|
|
||||||
|
def accept(self, visitor: Expr.Visitor[T]) -> T:
|
||||||
|
return visitor.visit_get_expr(self)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class VariableExpr(Expr):
|
||||||
|
name: Token
|
||||||
|
|
||||||
|
def accept(self, visitor: Expr.Visitor[T]) -> T:
|
||||||
|
return visitor.visit_variable_expr(self)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class GroupingExpr(Expr):
|
||||||
|
expr: Expr
|
||||||
|
|
||||||
|
def accept(self, visitor: Expr.Visitor[T]) -> T:
|
||||||
|
return visitor.visit_grouping_expr(self)
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class LiteralExpr(Expr):
|
class LiteralExpr(Expr):
|
||||||
value: Any
|
value: Any
|
||||||
@@ -174,7 +222,7 @@ class LiteralExpr(Expr):
|
|||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class WildcardExpr(Expr):
|
class WildcardExpr(Expr):
|
||||||
pass
|
token: Token
|
||||||
|
|
||||||
def accept(self, visitor: Expr.Visitor[T]) -> T:
|
def accept(self, visitor: Expr.Visitor[T]) -> T:
|
||||||
return visitor.visit_wildcard_expr(self)
|
return visitor.visit_wildcard_expr(self)
|
||||||
|
|||||||
20
gen/ast.py
20
gen/ast.py
@@ -1,13 +1,18 @@
|
|||||||
class SimpleTypeStmt:
|
class SimpleTypeStmt:
|
||||||
name: Token
|
name: Token
|
||||||
template: Optional[TemplateExpr]
|
template: Optional[TemplateExpr]
|
||||||
base: SimpleTypeExpr
|
base: TypeExpr
|
||||||
constraint: Optional[Expr]
|
constraint: Optional[Expr]
|
||||||
|
|
||||||
class SimpleTypeExpr:
|
class SimpleTypeExpr:
|
||||||
name: Token
|
name: Token
|
||||||
optional: bool
|
optional: bool
|
||||||
|
|
||||||
|
class LogicalExpr:
|
||||||
|
left: Expr
|
||||||
|
operator: Token
|
||||||
|
right: Expr
|
||||||
|
|
||||||
class BinaryExpr:
|
class BinaryExpr:
|
||||||
left: Expr
|
left: Expr
|
||||||
operator: Token
|
operator: Token
|
||||||
@@ -17,11 +22,21 @@ class UnaryExpr:
|
|||||||
operator: Token
|
operator: Token
|
||||||
right: Expr
|
right: Expr
|
||||||
|
|
||||||
|
class GetExpr:
|
||||||
|
expr: Expr
|
||||||
|
name: Token
|
||||||
|
|
||||||
|
class VariableExpr:
|
||||||
|
name: Token
|
||||||
|
|
||||||
|
class GroupingExpr:
|
||||||
|
expr: Expr
|
||||||
|
|
||||||
class LiteralExpr:
|
class LiteralExpr:
|
||||||
value: Any
|
value: Any
|
||||||
|
|
||||||
class WildcardExpr:
|
class WildcardExpr:
|
||||||
pass
|
token: Token
|
||||||
|
|
||||||
class TemplateExpr:
|
class TemplateExpr:
|
||||||
type: TypeExpr
|
type: TypeExpr
|
||||||
@@ -39,6 +54,7 @@ class ComplexTypeStmt:
|
|||||||
class PropertyStmt:
|
class PropertyStmt:
|
||||||
name: Token
|
name: Token
|
||||||
type: TypeExpr
|
type: TypeExpr
|
||||||
|
constraint: Optional[Expr]
|
||||||
|
|
||||||
class ExtendStmt:
|
class ExtendStmt:
|
||||||
type: TypeExpr
|
type: TypeExpr
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ def make_visitor_method(cls: str, param: str):
|
|||||||
)
|
)
|
||||||
return method.strip("\n")
|
return method.strip("\n")
|
||||||
|
|
||||||
def make_class(name: str, cls: str, base: str, param: str):
|
def make_class(name: str, cls: str, base: str):
|
||||||
body: str = cls.split("\n", 1)[1]
|
body: str = cls.split("\n", 1)[1]
|
||||||
func_name: str = snake_case(name)
|
func_name: str = snake_case(name)
|
||||||
cls_def: str = CLASS_TEMPLATE.format(
|
cls_def: str = CLASS_TEMPLATE.format(
|
||||||
@@ -101,10 +101,10 @@ def generate(src: str):
|
|||||||
print(f"Processing {name}")
|
print(f"Processing {name}")
|
||||||
if name.endswith("Stmt"):
|
if name.endswith("Stmt"):
|
||||||
stmt_visitor_methods.append(make_visitor_method(name, "stmt"))
|
stmt_visitor_methods.append(make_visitor_method(name, "stmt"))
|
||||||
statements.append(make_class(name, cls, "Stmt", "stmt"))
|
statements.append(make_class(name, cls, "Stmt"))
|
||||||
elif name.endswith("Expr"):
|
elif name.endswith("Expr"):
|
||||||
expr_visitor_methods.append(make_visitor_method(name, "expr"))
|
expr_visitor_methods.append(make_visitor_method(name, "expr"))
|
||||||
expressions.append(make_class(name, cls, "Expr", "expr"))
|
expressions.append(make_class(name, cls, "Expr"))
|
||||||
|
|
||||||
return TEMPLATE.format(
|
return TEMPLATE.format(
|
||||||
header=HEADER,
|
header=HEADER,
|
||||||
|
|||||||
Reference in New Issue
Block a user