Compare commits
6 Commits
34481c8ea8
...
5348e2b5c4
Author | SHA1 | Date |
---|---|---|
Luna | 5348e2b5c4 | |
Luna | 9d1c9cab7f | |
Luna | d69a64dbfb | |
Luna | 881833b187 | |
Luna | 5c58ac0238 | |
Luna | 809dad1095 |
|
@ -26,7 +26,7 @@ fn multwo(num: i32, double_flag: bool) i32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add(a: i32, b: i32) i32 {
|
fn add(a: i32, b: i32) i32 {
|
||||||
return a + b;
|
return a + b + (2 * b);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() i32 {
|
fn main() i32 {
|
||||||
|
|
|
@ -8,7 +8,7 @@ const Token = @import("tokens.zig").Token;
|
||||||
|
|
||||||
const SymbolUnderlyingType = comp.SymbolUnderlyingType;
|
const SymbolUnderlyingType = comp.SymbolUnderlyingType;
|
||||||
|
|
||||||
pub const TypeSolver = struct {
|
pub const Analyzer = struct {
|
||||||
allocator: *std.mem.Allocator,
|
allocator: *std.mem.Allocator,
|
||||||
|
|
||||||
// error handling
|
// error handling
|
||||||
|
@ -18,8 +18,8 @@ pub const TypeSolver = struct {
|
||||||
|
|
||||||
err_ctx_buffer: []u8,
|
err_ctx_buffer: []u8,
|
||||||
|
|
||||||
pub fn init(allocator: *std.mem.Allocator) !TypeSolver {
|
pub fn init(allocator: *std.mem.Allocator) !Analyzer {
|
||||||
return TypeSolver{
|
return Analyzer{
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.err_ctx_buffer = try allocator.alloc(u8, 512),
|
.err_ctx_buffer = try allocator.alloc(u8, 512),
|
||||||
};
|
};
|
||||||
|
@ -329,8 +329,8 @@ pub const TypeSolver = struct {
|
||||||
},
|
},
|
||||||
|
|
||||||
else => {
|
else => {
|
||||||
std.debug.warn(
|
self.doError(
|
||||||
"Expected Struct/Enum as get target, got {}\n",
|
"Expected Struct/Enum as get target, got {}",
|
||||||
comp.SymbolUnderlyingTypeEnum(global_typ),
|
comp.SymbolUnderlyingTypeEnum(global_typ),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -340,13 +340,23 @@ pub const TypeSolver = struct {
|
||||||
},
|
},
|
||||||
|
|
||||||
.Assign => |assign| {
|
.Assign => |assign| {
|
||||||
|
if (ctx.current_scope == null) {
|
||||||
|
self.doError("Can't assign without a scope");
|
||||||
|
return CompileError.Invalid;
|
||||||
|
}
|
||||||
|
|
||||||
var var_type = ctx.current_scope.?.env.get(
|
var var_type = ctx.current_scope.?.env.get(
|
||||||
assign.name.lexeme,
|
assign.name.lexeme,
|
||||||
).?.value;
|
);
|
||||||
|
|
||||||
|
if (var_type == null) {
|
||||||
|
self.doError("Assign target variable not found");
|
||||||
|
return CompileError.Invalid;
|
||||||
|
}
|
||||||
|
|
||||||
var value_type = try self.resolveExprType(ctx, assign.value);
|
var value_type = try self.resolveExprType(ctx, assign.value);
|
||||||
try self.expectSymUnTypeEqual(var_type, value_type);
|
try self.expectSymUnTypeEqual(var_type.?.value, value_type);
|
||||||
return var_type;
|
return var_type.?.value;
|
||||||
},
|
},
|
||||||
|
|
||||||
.Set => @panic("TODO analysis of Set exprs"),
|
.Set => @panic("TODO analysis of Set exprs"),
|
||||||
|
@ -422,10 +432,13 @@ pub const TypeSolver = struct {
|
||||||
try self.expectSymUnTypeEnum(expr, .Bool);
|
try self.expectSymUnTypeEnum(expr, .Bool);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO bump-dump scope
|
try ctx.bumpScope("loop");
|
||||||
|
|
||||||
for (loop.then_branch.toSlice()) |then_stmt| {
|
for (loop.then_branch.toSlice()) |then_stmt| {
|
||||||
try self.stmtPass(ctx, then_stmt);
|
try self.stmtPass(ctx, then_stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx.dumpScope();
|
||||||
},
|
},
|
||||||
|
|
||||||
// For (creates 1 scope) receives arrays, which we dont have yet
|
// For (creates 1 scope) receives arrays, which we dont have yet
|
||||||
|
|
|
@ -18,7 +18,6 @@ pub const NodeType = enum {
|
||||||
Struct,
|
Struct,
|
||||||
Enum,
|
Enum,
|
||||||
Block,
|
Block,
|
||||||
Stmt,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const ParamDecl = struct {
|
pub const ParamDecl = struct {
|
||||||
|
@ -323,8 +322,6 @@ pub const Node = union(NodeType) {
|
||||||
|
|
||||||
Block: StmtList,
|
Block: StmtList,
|
||||||
|
|
||||||
Stmt: *Stmt,
|
|
||||||
|
|
||||||
pub fn mkRoot(allocator: *std.mem.Allocator) !*Node {
|
pub fn mkRoot(allocator: *std.mem.Allocator) !*Node {
|
||||||
var node = try allocator.create(Node);
|
var node = try allocator.create(Node);
|
||||||
node.* = Node{ .Root = NodeList.init(allocator) };
|
node.* = Node{ .Root = NodeList.init(allocator) };
|
||||||
|
|
|
@ -99,12 +99,6 @@ pub fn printNode(node: *const Node, ident: usize) void {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
.Stmt => |stmt| {
|
|
||||||
printIdent(ident);
|
|
||||||
printStmt(ident, stmt);
|
|
||||||
std.debug.warn("\n");
|
|
||||||
},
|
|
||||||
|
|
||||||
.Struct => |struc| {
|
.Struct => |struc| {
|
||||||
print(ident, "(struct {} (\n", struc.name.lexeme);
|
print(ident, "(struct {} (\n", struc.name.lexeme);
|
||||||
for (struc.fields.toSlice()) |field| {
|
for (struc.fields.toSlice()) |field| {
|
||||||
|
|
|
@ -13,6 +13,7 @@ pub const CompileError = error{
|
||||||
LLVMError,
|
LLVMError,
|
||||||
EmitError,
|
EmitError,
|
||||||
TypeError,
|
TypeError,
|
||||||
|
Invalid,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn mkLLVMBool(val: bool) llvm.LLVMValueRef {
|
fn mkLLVMBool(val: bool) llvm.LLVMValueRef {
|
||||||
|
@ -258,6 +259,10 @@ pub const Codegen = struct {
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.Grouping => |expr_ptr| blk: {
|
||||||
|
break :blk try self.emitExpr(builder, expr_ptr);
|
||||||
|
},
|
||||||
|
|
||||||
else => {
|
else => {
|
||||||
std.debug.warn("Got unexpected expr {}\n", ast.ExprType(expr.*));
|
std.debug.warn("Got unexpected expr {}\n", ast.ExprType(expr.*));
|
||||||
return CompileError.EmitError;
|
return CompileError.EmitError;
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
int main(void) {
|
int main(void) {
|
||||||
__rayoko_main();
|
return __rayoko_main();
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ pub fn run(allocator: *std.mem.Allocator, slice: []const u8) !Result {
|
||||||
std.debug.warn("parse tree\n");
|
std.debug.warn("parse tree\n");
|
||||||
printer.printNode(root, 0);
|
printer.printNode(root, 0);
|
||||||
|
|
||||||
var solver = try analysis.TypeSolver.init(allocator);
|
var solver = try analysis.Analyzer.init(allocator);
|
||||||
var ctx = try solver.pass(root);
|
var ctx = try solver.pass(root);
|
||||||
|
|
||||||
std.debug.warn("symbol table\n");
|
std.debug.warn("symbol table\n");
|
||||||
|
|
|
@ -236,12 +236,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 {
|
fn mkStmtExpr(self: *Parser, expr: *Expr) !*Stmt {
|
||||||
var stmt = try self.allocator.create(Stmt);
|
var stmt = try self.allocator.create(Stmt);
|
||||||
stmt.* = Stmt{ .Expr = expr };
|
stmt.* = Stmt{ .Expr = expr };
|
||||||
|
@ -634,7 +628,8 @@ pub const Parser = struct {
|
||||||
|
|
||||||
while (self.peek().typ != .RightBrace) {
|
while (self.peek().typ != .RightBrace) {
|
||||||
var stmt = try self.parseStmt();
|
var stmt = try self.parseStmt();
|
||||||
printer.printNode(try self.mkStmt(stmt), 0);
|
printer.printStmt(0, stmt);
|
||||||
|
|
||||||
if (self.check(.Semicolon))
|
if (self.check(.Semicolon))
|
||||||
_ = try self.consumeSingle(.Semicolon);
|
_ = try self.consumeSingle(.Semicolon);
|
||||||
try stmts.append(stmt.*);
|
try stmts.append(stmt.*);
|
||||||
|
|
Loading…
Reference in New Issue