Compare commits

..

No commits in common. "7c4aa04b003fe079b79b14ea5fdfe25eccaeba66" and "02c2055601508b7e53cad635dfa9f5f5ae354d54" have entirely different histories.

3 changed files with 16 additions and 30 deletions

View file

@ -9,5 +9,5 @@ fn main(a int) int {
1 + 2 + 3 + 4
1 + 1 * 1
3 / (51 + 2)
println(2 * 1956 + a)
println(2 * 1956)
}

View file

@ -58,31 +58,18 @@ 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) {
@ -162,9 +149,20 @@ pub fn printNode(node: *Node, ident: usize) void {
},
.Stmt => |stmt| blk: {
printIdent(ident);
printStmt(stmt);
std.debug.warn("\n");
switch (stmt.*) {
.Println => |expr| blk2: {
printIdent(ident);
std.debug.warn("println(");
printExpr(expr);
std.debug.warn("\n");
},
.Expr => |expr| {
printIdent(ident);
printExpr(expr);
std.debug.warn("\n");
},
}
},
else => {
@ -199,9 +197,7 @@ pub fn printExpr(expr: *Expr) void {
}
},
.Variable => |token| std.debug.warn("{}", token.lexeme),
else => std.debug.warn("UnknownExpr-{}", @tagName(expr.*)),
else => std.debug.warn("unknown"),
}
}
@ -209,7 +205,5 @@ pub fn printStmt(stmt: *Stmt) void {
switch (stmt.*) {
.Println => |expr| parenthetize("println", &[_]*Expr{expr}),
.Expr => |expr| printExpr(expr),
else => std.debug.warn("STMT_UNKNOWN"),
}
}

View file

@ -240,13 +240,6 @@ 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);
@ -518,7 +511,6 @@ 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();