aboutsummaryrefslogtreecommitdiff
path: root/std/ast.pk
diff options
context:
space:
mode:
Diffstat (limited to 'std/ast.pk')
-rw-r--r--std/ast.pk81
1 files changed, 81 insertions, 0 deletions
diff --git a/std/ast.pk b/std/ast.pk
new file mode 100644
index 0000000..abc66ba
--- /dev/null
+++ b/std/ast.pk
@@ -0,0 +1,81 @@
+## std.ast: Exposes the AST for building and operating on with macros.
+
+pub type Expr = union
+ Ident(string), Number(int), Float(float), Char(chr), String(str)
+ Struct(list[tuple[field: str, value: Expr]])
+ Tuple(list[tuple[field: string?, value: Expr]])
+ List(list[Expr])
+ Let(id: Pattern, kind: Type?, value: ref Expr)
+ Var(id: Pattern, kind: Type?, value: ref Expr?)
+ Const(id: Pattern, kind: Type?, value: ref Expr)
+ FuncDecl( # effects?
+ id: str,
+ generics: list[GenericParams],
+ params: list[FunctionParams],
+ kind: Type,
+ body: list[Expr]
+ )
+ TypeDecl(id: str, generics: list[str], alias: Type)
+ Module(id: str, body: list[Expr])
+ Use(path: str)
+ Pub(Expr) # can easily generate incoherent statements. still desired?
+ Call(id: str, params: list[Expr])
+ Cond(branches: list[CondBranch], else_body: list[Expr]?)
+ Try(
+ try_body: list[Expr],
+ catches: list[TryBranch]
+ finally_body: list[Expr]?
+ )
+ Match(
+ item: ref Expr,
+ branches: list[MatchBranch]
+ )
+ Block(id: str?, body: list[Expr])
+ ConstBlock(body: list[Expr]),
+ For(binding: Pattern, range: ref Expr, body: list[Expr])
+ While(cond: ref Expr, body: list[Expr])
+ Loop(body: list[Expr]),
+
+pub type CondBranch = tuple
+ cond: Expr
+ body: list[Expr]
+
+pub type TryBranch = tuple
+ exceptions: list[str]
+ body: list[Expr]
+
+pub type MatchBranch = tuple
+ pattern: Pattern
+ guard: Option[Expr]
+ body: list[Expr]
+
+pub type Type = ref union
+ Void, Never,
+ Integer, Float, String,
+ Func(from: Type, to: Type) # todo: multiple parameters
+ Struct(list[tuple[id: str, kind: Type]])
+ Tuple(list[tuple[id: str?, kind: Type]])
+ Union(list[tuple[id: str, kind: Type]])
+ Interface( # todo: generics
+ funcs: list[Signature]
+ for_type: Type?
+ )
+ Array(size: uint, kind: Type)
+ List(Type)
+ Slice(Type) # todo: plus ownership
+ Alias(str) # todo: params?? huh?
+ Static(Type)
+ Mutable(Type)
+ Reference(Type)
+ Pointer(Type)
+pub type Signature = struct # todo: generics
+ id: str
+ effect: Option[str]
+ params: list[Type]
+ kind: Option[Type]
+pub type Pattern = union
+ Ident(str)
+ Number(int), Float(float), Char(chr), String(str)
+ Struct(name: str, params: list[Pattern])
+ Tuple(list[Pattern])
+ List(list[Pattern])