feat: ir for declarations and semantic analyzer start
This commit is contained in:
parent
f16162b5bb
commit
197a37ebe7
4 changed files with 453 additions and 145 deletions
|
|
@ -3,6 +3,7 @@ const std = @import("std");
|
|||
const tokenizer = @import("tokenizer.zig");
|
||||
const Ast = @import("Ast.zig");
|
||||
const AstGen = @import("AstGen.zig");
|
||||
const Sema = @import("Sema.zig");
|
||||
pub const Object = @import("Story/object.zig").Object;
|
||||
const Dumper = @import("Story/Dumper.zig");
|
||||
const assert = std.debug.assert;
|
||||
|
|
@ -481,11 +482,11 @@ pub fn loadFromString(
|
|||
) !Story {
|
||||
var arena_allocator = std.heap.ArenaAllocator.init(gpa);
|
||||
defer arena_allocator.deinit();
|
||||
|
||||
const arena = arena_allocator.allocator();
|
||||
const ast = try Ast.parse(gpa, arena, source_bytes, "<STDIN>", 0);
|
||||
|
||||
if (options.dump_writer) |w| {
|
||||
try w.writeAll("=== AST ===\n");
|
||||
try ast.render(gpa, w, .{
|
||||
.use_color = options.use_color,
|
||||
});
|
||||
|
|
@ -497,48 +498,25 @@ pub fn loadFromString(
|
|||
return error.Invalid;
|
||||
}
|
||||
|
||||
const comp_unit = try AstGen.generate(gpa, &ast);
|
||||
defer comp_unit.deinit(gpa);
|
||||
comp_unit.dumpStringsWithHex();
|
||||
var sem_ir = try AstGen.generate(gpa, &ast);
|
||||
defer sem_ir.deinit(gpa);
|
||||
|
||||
if (options.dump_writer) |w| {
|
||||
try w.writeAll("=== Semantic IR ===\n");
|
||||
sem_ir.dumpStringsWithHex();
|
||||
try sem_ir.render(gpa, w);
|
||||
}
|
||||
|
||||
var compiled = try Sema.compile(gpa, &sem_ir);
|
||||
defer compiled.deinit(gpa);
|
||||
|
||||
var story: Story = .{
|
||||
.allocator = gpa,
|
||||
.can_advance = false,
|
||||
.dump_writer = options.dump_writer,
|
||||
};
|
||||
errdefer story.deinit();
|
||||
|
||||
for (comp_unit.knots) |compiled_chunk| {
|
||||
const chunk_name = comp_unit.resolveString(compiled_chunk.name_ref);
|
||||
var constant_pool: std.ArrayList(*Object) = .empty;
|
||||
try constant_pool.ensureUnusedCapacity(gpa, compiled_chunk.constants.len);
|
||||
defer constant_pool.deinit(gpa);
|
||||
|
||||
for (comp_unit.resolveConstants(compiled_chunk.constants)) |constant| {
|
||||
switch (constant) {
|
||||
.number => |value| {
|
||||
const object: *Object.Number = try .create(&story, .{ .integer = value });
|
||||
constant_pool.appendAssumeCapacity(&object.base);
|
||||
},
|
||||
.string => |ref| {
|
||||
const bytes = comp_unit.resolveString(ref);
|
||||
const object: *Object.String = try .create(&story, bytes);
|
||||
constant_pool.appendAssumeCapacity(&object.base);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const runtime_chunk: *Object.ContentPath = try .create(&story, .{
|
||||
.name = try .create(&story, chunk_name),
|
||||
.arity = @intCast(compiled_chunk.arity),
|
||||
.locals_count = @intCast(compiled_chunk.stack_size - compiled_chunk.arity),
|
||||
.const_pool = try constant_pool.toOwnedSlice(gpa),
|
||||
.bytes = try gpa.dupe(u8, comp_unit.resolveInstructions(compiled_chunk.instructions)),
|
||||
});
|
||||
try story.paths.append(gpa, &runtime_chunk.base);
|
||||
}
|
||||
|
||||
try story.divert("$__main__$");
|
||||
story.can_advance = true;
|
||||
try compiled.buildRuntime(gpa, sem_ir, &story);
|
||||
// try story.divert("$__main__$");
|
||||
// story.can_advance = true;
|
||||
return story;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue