summaryrefslogtreecommitdiff
path: root/src/ast.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast.zig')
-rw-r--r--src/ast.zig67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/ast.zig b/src/ast.zig
new file mode 100644
index 0000000..2f8f209
--- /dev/null
+++ b/src/ast.zig
@@ -0,0 +1,67 @@
+const std = @import("std");
+const tok = @import("tokenize.zig");
+
+const SyntaxError = error{SyntaxError};
+const expectedToken = error{ExpectedToken};
+
+pub const BinOp = enum {
+ Add,
+ Sub,
+ Mul,
+ Div,
+};
+
+pub const Literal = union(enum) {
+ Int: i32,
+};
+
+pub const Ast = union(enum) {
+ Expr: struct {
+ kind: ExprKind,
+ },
+ Stmt: struct {
+ kind: StmtKind,
+ },
+};
+
+const StmtKind = union(enum) {
+ exit: Ast.Expr,
+};
+
+const ExprKind = union(enum) {
+ Literal: Literal,
+ BinaryOp: struct {
+ op: BinOp,
+ left: Ast.Expr,
+ right: Ast.Expr,
+ },
+};
+
+fn checkType(token: tok.Token, typ: tok.TokenType) bool {
+ return switch (token) {
+ typ => true,
+ else => false,
+ };
+}
+
+const AstParser = struct {
+ tokens: tok.Iterator(tok.Token),
+ fn parseStmt(self: *AstParser) !Ast.Stmt {
+ return switch (self.tokens.peek().?) {
+ .ret => try self.exitStmt(),
+ };
+ }
+
+ fn parseExpr(self: *AstParser) !Ast.Expr {
+
+ }
+
+ fn exitStmt(self: *AstParser) !Ast.Stmt {
+ if (!checkType(self.tokens.consume().?, tok.TokenType.ret)) return expectedToken;
+ const value = self.parseExpr();
+
+ if (!checkType(self.tokens.consume().?, tok.TokenType.semiCol)) return expectedToken;
+ const kind = StmtKind{ .exit = value };
+ return Ast.Stmt{ .kind = kind };
+ }
+};