aboutsummaryrefslogtreecommitdiff
path: root/std/fundamental/ast.pk
diff options
context:
space:
mode:
Diffstat (limited to 'std/fundamental/ast.pk')
-rw-r--r--std/fundamental/ast.pk119
1 files changed, 119 insertions, 0 deletions
diff --git a/std/fundamental/ast.pk b/std/fundamental/ast.pk
new file mode 100644
index 0000000..25bdc02
--- /dev/null
+++ b/std/fundamental/ast.pk
@@ -0,0 +1,119 @@
+## std/ast: Exposes the AST for building and operating on with macros.
+
+pub type Ident = string
+pub type Number = int
+pub type Float = float
+pub type Char = char
+pub type String = str
+pub type Struct = list[struct[field: str, value: Expr]]
+pub type Tuple = list[struct[field: Option[string], value: Expr]]
+pub type List = list[Expr]
+
+pub type Let = struct
+ id: Pattern
+ kind: Option[Type]
+ value: ref Expr
+pub type Var = struct
+ id: Pattern
+ kind: Option[Type]
+ value: Option[ref Expr] # variable bindings can be delayed
+pub type Const = struct
+ id: Pattern
+ kind: Option[Type]
+ value = ref Expr
+pub type FuncDecl = struct
+ public: bool
+ effect: Option[str]
+ id: str
+ generics: list[struct[name: str, kind: Option[Type]]]
+ params: list[struct[name: str, kind: Type]]
+ kind: Type
+ body: list[Expr]
+pub type TypeDecl = struct
+ id: str
+ generics: list[str]
+ alias: Type
+pub type Import = struct
+ mod_from: Option[string]
+ imports: list[str]
+ alias: Option[str]
+pub type Module = struct
+ name: str
+ body: list[ref Expr]
+
+pub type Call = struct
+ id: str
+ params: list[Expr]
+pub type Cond = struct
+ branches: list[CondBranch]
+ else_body: Option[list[Expr]]
+pub type Try = struct
+ body: ref Expr
+ catches: list[struct[exceptions: list[str], body: list[Expr]]]
+ finally_body: Option[list[Expr]]
+pub type Match = struct
+ item: ref Expr
+ branches: list[MatchBranch]
+pub type Block = struct
+ id: Option[str]
+ body: list[Expr]
+pub type Static = struct
+ body: list[Expr]
+pub type For = struct
+ binding: Pattern
+ range: ref Expr
+ body: list[Expr]
+pub type While = struct
+ cond: ref Expr
+ body: list[Expr]
+pub type Loop = struct
+ body: list[Expr]
+
+# the first style of union. naming anonymous types.
+pub type Type = union
+ Void, Never,
+ Integer, Float, String,
+ Func: struct[from, to: ref Type] # todo: multiple parameters
+ Struct: list[struct[id: str, kind: Type]]
+ Tuple: list[struct[id: Option[str], kind: Type]]
+ Union: list[struct[id: str, kind: Type]]
+ Interface: struct # todo: generics
+ funcs: list[Signature]
+ for_type: Option[ref Type]
+ Array: struct[size: uint, kind: ref Type]
+ List: ref Type
+ Slice: ref Type # todo: plus ownership
+ Alias: str # todo: params?? huh?
+ Static: ref Type
+ Mutable: ref Type
+ Reference: ref Type
+pub type Signature = struct # todo: generics
+ id: str
+ effect: Option[str]
+ params: list[Type]
+ kind: Option[Type]
+pub type Pattern = union
+ Ident: str
+ Struct: struct[name: str, params: list[]]
+ Tuple: list[Pattern]
+ List
+pub type CondBranch = struct
+ cond: Expr
+ body: list[Expr]
+pub type MatchBranch = struct
+ pattern: Pattern
+ guard: Option[Expr]
+ body: Expr
+
+# the second style of union. A union of literal types, no names.
+pub type Expr = union
+ Ident, Number, Float, Char, String, Struct, Tuple, List,
+ Let, Var, Const, FuncDecl, TypeDecl, Import, Module,
+ Call, Cond, Try, Match, Block, Static, For, While, Loop,
+
+# todo: decide on a style of union
+
+# anonymous struct objects can be constructed with {}
+# anonymous tuple objects can be constructed with ()
+# anonymous list objects can be constructed with []
+# anonymous union *types* can be constructed with | (in parameters)