diff options
| author | Mel <einebeere@gmail.com> | 2022-04-20 02:48:45 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-04-20 02:48:45 +0200 |
| commit | 20bc0c2243888900d2f04328e57ad2d7ca0a2403 (patch) | |
| tree | 6f0fc535fd8a74eb8f91c4a35fa3c32f012f0a59 /pkg | |
| parent | db3dd28cdf9009880c1ab5f12c47b673dd00bc43 (diff) | |
| download | jinx-20bc0c2243888900d2f04328e57ad2d7ca0a2403.tar.zst jinx-20bc0c2243888900d2f04328e57ad2d7ca0a2403.zip | |
Basic AST for lang
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/lang/ast/ast.go | 5 | ||||
| -rw-r--r-- | pkg/lang/ast/expr.go | 87 | ||||
| -rw-r--r-- | pkg/lang/ast/nodes.go | 18 | ||||
| -rw-r--r-- | pkg/lang/ast/op.go | 26 | ||||
| -rw-r--r-- | pkg/lang/ast/stmt.go | 74 |
5 files changed, 210 insertions, 0 deletions
diff --git a/pkg/lang/ast/ast.go b/pkg/lang/ast/ast.go new file mode 100644 index 0000000..43d0c28 --- /dev/null +++ b/pkg/lang/ast/ast.go @@ -0,0 +1,5 @@ +package ast + +type Program struct { + Stmts []Stmt[any] +} \ No newline at end of file diff --git a/pkg/lang/ast/expr.go b/pkg/lang/ast/expr.go new file mode 100644 index 0000000..a4d6f56 --- /dev/null +++ b/pkg/lang/ast/expr.go @@ -0,0 +1,87 @@ +package ast + +import "jinx/pkg/lang/scanner/token" + +type ExprKind int + +const ( + ExprKindBinary ExprKind = iota + ExprKindUnary + ExprKindCall + ExprKindSubscription + + ExprKindGroup + ExprKindFnLit + ExprKindArrayLit + ExprKindIdent + ExprKindIntLit + ExprKindFloatLit + ExprKindStringLit + ExprKindBoolLit + ExprKindNullLit + ExprKindThis +) + +type Expr[T any] struct { + At token.Loc + Kind ExprKind + Value T +} + +type ExprBinary struct { + Left Expr[any] + Op BinOp + Right Expr[any] +} + +type ExprUnary struct { + Op UnOp + Value Expr[any] +} + +type ExprCall struct { + Callee Expr[any] + Args []Expr[any] +} + +type ExprSubscription struct { + Obj Expr[any] + Key Expr[any] +} + +type ExprGroup struct { + Value Expr[any] +} + +type ExprFnLit struct { + Args []IdentNode + Body BlockNode +} + +type ExprArrayLit struct { + Values []Expr[any] +} + +type ExprIdent struct { + Value IdentNode +} + +type ExprIntLit struct { + Value uint64 +} + +type ExprFloatLit struct { + Value float64 +} + +type ExprStringLit struct { + Value string +} + +type ExprBoolLit struct { + Value bool +} + +type ExprNullLit struct{} + +type ExprThis struct{} diff --git a/pkg/lang/ast/nodes.go b/pkg/lang/ast/nodes.go new file mode 100644 index 0000000..699d025 --- /dev/null +++ b/pkg/lang/ast/nodes.go @@ -0,0 +1,18 @@ +package ast + +import "jinx/pkg/lang/scanner/token" + +type IdentNode struct { + At token.Loc + Value string +} + +type BlockNode struct { + At token.Loc + Stmts []Stmt[any] +} + +type CondNode struct { + Cond Expr[any] + Then BlockNode +} diff --git a/pkg/lang/ast/op.go b/pkg/lang/ast/op.go new file mode 100644 index 0000000..a708c78 --- /dev/null +++ b/pkg/lang/ast/op.go @@ -0,0 +1,26 @@ +package ast + +type BinOp int + +const ( + BinOpAdd BinOp = iota + BinOpSub + BinOpMul + BinOpDiv + BinOpMod + + BinOpAssign + BinOpEq + BinOpNeq + BinOpLt + BinOpLte + BinOpGt + BinOpGte +) + +type UnOp int + +const ( + UnOpNot UnOp = iota + UnOpNeg +) diff --git a/pkg/lang/ast/stmt.go b/pkg/lang/ast/stmt.go new file mode 100644 index 0000000..e924f8c --- /dev/null +++ b/pkg/lang/ast/stmt.go @@ -0,0 +1,74 @@ +package ast + +import "jinx/pkg/lang/scanner/token" + +type StmtKind int + +const ( + StmtKindUse StmtKind = iota + StmtKindFnDecl + StmtKindObjectDecl + StmtKindVarDecl + StmtKindIf + StmtKindTry + StmtKindReturn + StmtKindContinue + StmtKindBreak + StmtKindThrow + StmtKindExpr +) + +type Stmt[T any] struct { + At token.Loc + Kind StmtKind + Value T +} + +type StmtUse struct { + Globals []IdentNode + Modules []IdentNode + Author IdentNode +} + +type StmtFnDecl struct { + Name IdentNode + Args []IdentNode + Body BlockNode +} + +type StmtObjectDecl struct{} + +type StmtVarDecl struct { + Name IdentNode + Value Expr[any] +} + +type StmtIf struct { + Cond Expr[any] + Then BlockNode + Elifs []CondNode + Else BlockNode +} + +type StmtTry struct { + Try BlockNode + CatchedName IdentNode + Catch BlockNode + Finally BlockNode +} + +type StmtReturn struct { + Value Expr[any] +} + +type StmtContinue struct{} + +type StmtBreak struct{} + +type StmtThrow struct { + Value Expr[any] +} + +type StmtExpr struct { + Value Expr[any] +} |
