Compare commits

..

No commits in common. "a4fa0e0cfcd4be2c429643120bd3bdb4f2861724" and "2ba0efa92c4ee767230a1d378bab8eaef08bcc1f" have entirely different histories.

4 changed files with 26 additions and 107 deletions

View file

@ -3,7 +3,6 @@ const tokens = @import("tokens.zig");
const Token = tokens.Token; const Token = tokens.Token;
pub const NodeList = std.ArrayList(*Node); pub const NodeList = std.ArrayList(*Node);
pub const StmtList = std.ArrayList(*Stmt);
pub const ExprList = std.ArrayList(*Expr); pub const ExprList = std.ArrayList(*Expr);
pub const ParamList = std.ArrayList(ParamDecl); pub const ParamList = std.ArrayList(ParamDecl);
pub const ConstList = std.ArrayList(SingleConst); pub const ConstList = std.ArrayList(SingleConst);
@ -15,7 +14,6 @@ pub const NodeType = enum {
ConstDecl, ConstDecl,
Block, Block,
Expr, Expr,
Stmt,
}; };
pub const ParamDecl = struct { pub const ParamDecl = struct {
@ -28,12 +26,14 @@ pub const ParamDecl = struct {
pub const FnDecl = struct { pub const FnDecl = struct {
func_name: Token, func_name: Token,
params: ParamList, params: ParamList,
body: StmtList, body: ExprList,
}; };
pub const SingleConst = struct { pub const SingleConst = struct {
name: Token, name: Token,
expr: *Expr,
// TODO expr
value: Token,
}; };
pub const BinaryExpr = struct { pub const BinaryExpr = struct {
@ -61,26 +61,14 @@ pub const Expr = union(enum) {
Grouping: *Expr, Grouping: *Expr,
}; };
pub const Stmt = union(enum) {
Expr: *Expr,
Println: *Expr,
pub fn mkPrintln(allocator: *std.mem.Allocator, expr: *Expr) !*Stmt {
var println = try allocator.create(Stmt);
println.* = Stmt{ .Println = expr };
return println;
}
};
pub const Node = union(NodeType) { pub const Node = union(NodeType) {
Root: NodeList, Root: NodeList,
FnDecl: FnDecl, FnDecl: FnDecl,
ConstDecl: ConstList, ConstDecl: ConstList,
Block: StmtList, // TODO StmtList
Block: ExprList,
Expr: *Expr, Expr: *Expr,
Stmt: *Stmt,
}; };
pub fn mkRoot(allocator: *std.mem.Allocator) !*Node { pub fn mkRoot(allocator: *std.mem.Allocator) !*Node {
@ -115,9 +103,9 @@ pub fn printNode(node: *Node, ident: usize) void {
); );
} }
for (decl.body.toSlice()) |stmt| { for (decl.body.toSlice()) |expr| {
printIdent(ident + 1); printIdent(ident + 1);
printStmt(stmt); printExpr(expr);
std.debug.warn("\n"); std.debug.warn("\n");
} }
}, },
@ -127,12 +115,10 @@ pub fn printNode(node: *Node, ident: usize) void {
for (consts.toSlice()) |const_decl| { for (consts.toSlice()) |const_decl| {
print( print(
ident + 1, ident + 1,
"{} = ", "'{}' = '{}'\n",
const_decl.name.lexeme, const_decl.name.lexeme,
const_decl.value.lexeme,
); );
printExpr(const_decl.expr);
std.debug.warn("\n");
} }
}, },
@ -142,28 +128,7 @@ pub fn printNode(node: *Node, ident: usize) void {
} }
}, },
.Expr => |expr| { .Expr => |expr| printExpr(expr),
printIdent(ident);
printExpr(expr);
std.debug.warn("\n");
},
.Stmt => |stmt| blk: {
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 => { else => {
print(ident, "unknown node: {}\n", node); print(ident, "unknown node: {}\n", node);
@ -200,10 +165,3 @@ pub fn printExpr(expr: *Expr) void {
else => std.debug.warn("unknown"), else => std.debug.warn("unknown"),
} }
} }
pub fn printStmt(stmt: *Stmt) void {
switch (stmt.*) {
.Println => |expr| parenthetize("println", &[_]*Expr{expr}),
.Expr => |expr| printExpr(expr),
}
}

View file

@ -13,7 +13,6 @@ const Result = main.Result;
const Node = ast.Node; const Node = ast.Node;
const Expr = ast.Expr; const Expr = ast.Expr;
const Stmt = ast.Stmt;
pub const Parser = struct { pub const Parser = struct {
allocator: *Allocator, allocator: *Allocator,
@ -118,12 +117,14 @@ pub const Parser = struct {
return false; return false;
} }
fn mkFnDecl(self: *Parser, name: Token, params: ast.ParamList, block: ast.StmtList) !*ast.Node { fn mkFnDecl(self: *Parser, name: Token, params: ast.ParamList, block: ast.ExprList) !*ast.Node {
var node = try self.allocator.create(Node); var node = try self.allocator.create(Node);
node.* = Node{ node.* = Node{
.FnDecl = ast.FnDecl{ .FnDecl = ast.FnDecl{
.func_name = name, .func_name = name,
.params = params, .params = params,
// TODO stmt
.body = block, .body = block,
}, },
}; };
@ -136,9 +137,9 @@ pub const Parser = struct {
return node; return node;
} }
fn mkBlock(self: *Parser, stmts: ast.StmtList) !*ast.Node { fn mkBlock(self: *Parser, exprs: ast.ExprList) !*ast.Node {
var node = try self.allocator.create(Node); var node = try self.allocator.create(Node);
node.* = Node{ .Block = stmts }; node.* = Node{ .Block = exprs };
return node; return node;
} }
@ -148,18 +149,6 @@ pub const Parser = struct {
return node; return node;
} }
fn mkStmt(self: *Parser, stmt: *Stmt) !*ast.Node {
var node = try self.allocator.create(Node);
node.* = Node{ .Stmt = stmt };
return node;
}
fn mkStmtExpr(self: *Parser, expr: *Expr) !*Stmt {
var stmt = try self.allocator.create(Stmt);
stmt.* = Stmt{ .Expr = expr };
return stmt;
}
fn mkGrouping(self: *Parser, expr: *Expr) !*ast.Expr { fn mkGrouping(self: *Parser, expr: *Expr) !*ast.Expr {
var grouping = try self.allocator.create(Expr); var grouping = try self.allocator.create(Expr);
grouping.* = Expr{ .Grouping = expr }; grouping.* = Expr{ .Grouping = expr };
@ -345,14 +334,12 @@ pub const Parser = struct {
const const_name = try self.consumeSingle(.Identifier); const const_name = try self.consumeSingle(.Identifier);
_ = try self.consumeSingle(.Equal); _ = try self.consumeSingle(.Equal);
var expr = try self.parseExpr(); // TODO expr
// _ = try self.nextToken(); const const_value = self.peek();
_ = try self.nextToken();
//const const_value = try self.consumeSingle(.Identifier); //const const_value = try self.consumeSingle(.Identifier);
try consts.append(ast.SingleConst{ try consts.append(ast.SingleConst{ .name = const_name, .value = const_value });
.name = const_name,
.expr = expr.Expr,
});
} }
_ = try self.consumeSingle(.RightParen); _ = try self.consumeSingle(.RightParen);
@ -373,42 +360,20 @@ pub const Parser = struct {
} }
fn parseBlock(self: *@This()) !*Node { fn parseBlock(self: *@This()) !*Node {
var stmts = ast.StmtList.init(self.allocator); var exprs = ast.ExprList.init(self.allocator);
errdefer stmts.deinit(); errdefer exprs.deinit();
_ = try self.consumeSingle(.LeftBrace); _ = try self.consumeSingle(.LeftBrace);
while (self.peek().ttype != .RightBrace) { while (self.peek().ttype != .RightBrace) {
var node = try self.parseStmt(); var node = try self.parseExpr();
ast.printNode(node, 0); ast.printNode(node, 0);
try stmts.append(node.Stmt); try exprs.append(node.Expr);
//_ = try self.nextToken();
} }
_ = try self.consumeSingle(.RightBrace); _ = try self.consumeSingle(.RightBrace);
return try self.mkBlock(stmts); return try self.mkBlock(exprs);
}
fn parseStmt(self: *@This()) anyerror!*Node {
var stmt = switch (self.peek().ttype) {
.Println => try self.parsePrintln(),
// TODO make newlines tokens and consume newline?
else => try self.parseStmtExpr(),
};
return try self.mkStmt(stmt);
}
fn parsePrintln(self: *@This()) !*Stmt {
_ = try self.consumeSingle(.Println);
var expr = try self.parseExpr();
return try Stmt.mkPrintln(self.allocator, expr.Expr);
}
fn parseStmtExpr(self: *@This()) !*Stmt {
var expr = (try self.parseExpr()).Expr;
return try self.mkStmtExpr(expr);
} }
fn parseExpr(self: *@This()) anyerror!*Node { fn parseExpr(self: *@This()) anyerror!*Node {

View file

@ -49,7 +49,6 @@ const keywords = [_][]const u8{
"true", "true",
"false", "false",
"None", "None",
"println",
}; };
const keyword_ttypes = [_]TokenType{ const keyword_ttypes = [_]TokenType{
@ -77,7 +76,6 @@ const keyword_ttypes = [_]TokenType{
.True, .True,
.False, .False,
.None, .None,
.Println,
}; };
fn getKeyword(keyword: []const u8) ?TokenType { fn getKeyword(keyword: []const u8) ?TokenType {

View file

@ -71,8 +71,6 @@ pub const TokenType = enum {
False, False,
None, None,
Println,
EOF, EOF,
}; };