Compare commits
2 commits
02c2055601
...
7c4aa04b00
Author | SHA1 | Date | |
---|---|---|---|
7c4aa04b00 | |||
d93adbbd3e |
3 changed files with 30 additions and 16 deletions
|
@ -9,5 +9,5 @@ fn main(a int) int {
|
|||
1 + 2 + 3 + 4
|
||||
1 + 1 * 1
|
||||
3 / (51 + 2)
|
||||
println(2 * 1956)
|
||||
println(2 * 1956 + a)
|
||||
}
|
||||
|
|
32
src/ast.zig
32
src/ast.zig
|
@ -58,18 +58,31 @@ pub const Expr = union(enum) {
|
|||
Binary: BinaryExpr,
|
||||
Unary: UnaryExpr,
|
||||
Literal: LiteralExpr,
|
||||
Variable: Token,
|
||||
Grouping: *Expr,
|
||||
};
|
||||
|
||||
pub const VarDecl = struct {
|
||||
name: Token,
|
||||
initializer: *Expr,
|
||||
};
|
||||
|
||||
pub const Stmt = union(enum) {
|
||||
Expr: *Expr,
|
||||
Println: *Expr,
|
||||
VarDecl: VarDecl,
|
||||
|
||||
pub fn mkPrintln(allocator: *std.mem.Allocator, expr: *Expr) !*Stmt {
|
||||
var println = try allocator.create(Stmt);
|
||||
println.* = Stmt{ .Println = expr };
|
||||
return println;
|
||||
}
|
||||
|
||||
pub fn mkVarDecl(allocator: *std.mem.Allocator, name: Token, init: *Expr) !*Stmt {
|
||||
var vardecl = try allocator.create(Stmt);
|
||||
vardecl.* = Stmt{ .VarDecl = VarDecl{ .name = name, .initializer = init } };
|
||||
return vardecl;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Node = union(NodeType) {
|
||||
|
@ -149,22 +162,11 @@ pub fn printNode(node: *Node, ident: usize) void {
|
|||
},
|
||||
|
||||
.Stmt => |stmt| blk: {
|
||||
switch (stmt.*) {
|
||||
.Println => |expr| blk2: {
|
||||
printIdent(ident);
|
||||
std.debug.warn("println(");
|
||||
printExpr(expr);
|
||||
printStmt(stmt);
|
||||
std.debug.warn("\n");
|
||||
},
|
||||
|
||||
.Expr => |expr| {
|
||||
printIdent(ident);
|
||||
printExpr(expr);
|
||||
std.debug.warn("\n");
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
else => {
|
||||
print(ident, "unknown node: {}\n", node);
|
||||
},
|
||||
|
@ -197,7 +199,9 @@ pub fn printExpr(expr: *Expr) void {
|
|||
}
|
||||
},
|
||||
|
||||
else => std.debug.warn("unknown"),
|
||||
.Variable => |token| std.debug.warn("{}", token.lexeme),
|
||||
|
||||
else => std.debug.warn("UnknownExpr-{}", @tagName(expr.*)),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,5 +209,7 @@ pub fn printStmt(stmt: *Stmt) void {
|
|||
switch (stmt.*) {
|
||||
.Println => |expr| parenthetize("println", &[_]*Expr{expr}),
|
||||
.Expr => |expr| printExpr(expr),
|
||||
|
||||
else => std.debug.warn("STMT_UNKNOWN"),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -240,6 +240,13 @@ pub const Parser = struct {
|
|||
return expr;
|
||||
}
|
||||
|
||||
fn mkVariable(self: *Parser, variable: Token) !*ast.Expr {
|
||||
var expr = try self.allocator.create(Expr);
|
||||
expr.* = Expr{ .Variable = variable };
|
||||
|
||||
return expr;
|
||||
}
|
||||
|
||||
pub fn parse(self: *Parser) !*ast.Node {
|
||||
self.tokens = try self.allocator.alloc(Token, 0);
|
||||
var root = try ast.mkRoot(self.allocator);
|
||||
|
@ -511,6 +518,7 @@ pub const Parser = struct {
|
|||
.Integer => try self.mkInteger(lexeme),
|
||||
.Float => try self.mkFloat(lexeme),
|
||||
.String => try self.mkString(lexeme),
|
||||
.Identifier => try self.mkVariable(self.peek()),
|
||||
|
||||
.LeftParen => blk: {
|
||||
_ = try self.nextToken();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue