aboutsummaryrefslogtreecommitdiff
path: root/src/parse.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.zig')
-rw-r--r--src/parse.zig35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/parse.zig b/src/parse.zig
index 26f32e9..bd6b000 100644
--- a/src/parse.zig
+++ b/src/parse.zig
@@ -64,9 +64,9 @@ pub const Stmt = struct {
return switch (self.type) {
.expr => |expr| writer.print("{}", .{fmt(expr, source, indent)}),
.block => |b| writer.print("{}", .{fmt(b, source, indent)}),
- .assign_var => |assign_var| writer.print("{s}{s} = {}", .{
- if (assign_var.is_decl) "let " else "",
+ .assign_var => |assign_var| writer.print("{s} {s} {}", .{
assign_var.ident.getIdent(source),
+ if (assign_var.is_decl) ":=" else "=",
fmt(assign_var.value, source, indent),
}),
.@"while" => |@"while"| try writer.print("while {} {}", .{
@@ -149,7 +149,13 @@ pub const Expr = struct {
}
};
-const ParseError = error{ OutOfMemory, ExpectedRightParen, UnexpectedToken, InvalidAssignTarget };
+const ParseError = error{
+ OutOfMemory,
+ ExpectedRightParen,
+ UnexpectedToken,
+ InvalidAssignTarget,
+ ExprStatementMustBeCall,
+};
pub fn file(allocator: Allocator, lexer: *Lexer) !Block {
var stmts: std.ArrayList(Stmt) = .init(allocator);
@@ -177,16 +183,6 @@ fn block(allocator: Allocator, lexer: *Lexer) !Block {
fn statement(allocator: Allocator, lexer: *Lexer) ParseError!Stmt {
switch (lexer.peek().type) {
- .let => {
- const let = lexer.next();
- const ident = try mustEat(lexer, .identifier);
- _ = try mustEat(lexer, .equal);
- const value = try expression(allocator, lexer);
- return .{
- .loc = let.loc.combine(value.loc),
- .type = .{ .assign_var = .{ .ident = ident.loc, .is_decl = true, .value = value } },
- };
- },
.left_curly => {
const b = try block(allocator, lexer);
return .{
@@ -208,7 +204,12 @@ fn statement(allocator: Allocator, lexer: *Lexer) ParseError!Stmt {
},
else => {
const lhs = try expression(allocator, lexer);
- if (lexer.peek().type == .equal) {
+
+ const colon = if (lexer.peek().type == .colon)
+ try mustEat(lexer, .colon)
+ else
+ null;
+ if (colon != null or lexer.peek().type == .equal) {
_ = try mustEat(lexer, .equal);
const value = try expression(allocator, lexer);
if (lhs.type != .identifier) {
@@ -216,9 +217,11 @@ fn statement(allocator: Allocator, lexer: *Lexer) ParseError!Stmt {
return error.InvalidAssignTarget;
}
return .{
- .loc = lhs.loc,
- .type = .{ .assign_var = .{ .ident = lhs.loc, .is_decl = false, .value = value } },
+ .loc = lhs.loc.combine(value.loc),
+ .type = .{ .assign_var = .{ .ident = lhs.loc, .is_decl = colon != null, .value = value } },
};
+ } else if (lhs.type != .call) {
+ return error.ExprStatementMustBeCall;
}
return .{
.loc = lhs.loc,