2019-06-05 01:11:11 +00:00
|
|
|
pub const AstNodeType = enum {
|
|
|
|
Program,
|
2019-06-05 02:44:27 +00:00
|
|
|
BinOp,
|
|
|
|
Number,
|
2019-06-05 01:11:11 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
pub const AstNode = union(AstNodeType) {
|
|
|
|
Program: []AstNode,
|
2019-06-05 02:44:27 +00:00
|
|
|
BinOp: AstBinOp,
|
|
|
|
Number: AstNumber,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const BinOpType = enum {
|
|
|
|
Equality,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const AstBinOp = struct {
|
|
|
|
optype: BinOpType,
|
|
|
|
|
|
|
|
// TODO expression
|
2019-06-05 02:53:55 +00:00
|
|
|
left: *AstNode,
|
|
|
|
right: *AstNode,
|
2019-06-05 02:44:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
pub const NumberType = enum {
|
|
|
|
Integer32,
|
|
|
|
Integer64,
|
|
|
|
Unsigned32,
|
|
|
|
Unsigned64,
|
|
|
|
Float32,
|
|
|
|
Float64,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const AstNumber = union(NumberType) {
|
|
|
|
Integer32: i32,
|
|
|
|
Integer64: i64,
|
|
|
|
Unsigned32: u32,
|
|
|
|
Unsigned64: u64,
|
|
|
|
Float32: f32,
|
|
|
|
Float64: f64,
|
2019-06-05 01:11:11 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
pub fn printNode(stdout: var, node: AstNode) anyerror!void {
|
|
|
|
switch (node) {
|
|
|
|
.Program => |children| try printNodes(stdout, children),
|
2019-06-05 02:44:27 +00:00
|
|
|
.BinOp => |bin_op| blk: {
|
|
|
|
try stdout.print("(");
|
|
|
|
switch (bin_op.optype) {
|
|
|
|
.Equality => try stdout.write("=="),
|
|
|
|
}
|
|
|
|
|
|
|
|
try stdout.write(" ");
|
2019-06-05 02:53:55 +00:00
|
|
|
try printNode(stdout, bin_op.left.*);
|
2019-06-05 02:44:27 +00:00
|
|
|
try stdout.write(" ");
|
2019-06-05 02:53:55 +00:00
|
|
|
try printNode(stdout, bin_op.right.*);
|
2019-06-05 02:44:27 +00:00
|
|
|
try stdout.print(")");
|
|
|
|
},
|
|
|
|
.Number => |ast_num| {
|
|
|
|
switch (ast_num) {
|
|
|
|
.Integer32 => |num| try stdout.print("{}", num),
|
|
|
|
.Integer64 => |num| try stdout.print("{}", num),
|
|
|
|
.Unsigned32 => |num| try stdout.print("{}", num),
|
|
|
|
.Unsigned64 => |num| try stdout.print("{}", num),
|
|
|
|
.Float32 => |num| try stdout.print("{}", num),
|
|
|
|
.Float64 => |num| try stdout.print("{}", num),
|
|
|
|
}
|
|
|
|
},
|
2019-06-05 01:11:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn printNodes(stdout: var, nodes: []AstNode) anyerror!void {
|
2019-06-05 02:44:27 +00:00
|
|
|
try stdout.print("(");
|
|
|
|
|
2019-06-05 01:11:11 +00:00
|
|
|
for (nodes) |node| {
|
2019-06-05 02:44:27 +00:00
|
|
|
try stdout.print(" ");
|
2019-06-05 01:11:11 +00:00
|
|
|
try printNode(stdout, node);
|
|
|
|
}
|
2019-06-05 02:44:27 +00:00
|
|
|
|
|
|
|
try stdout.print(")");
|
2019-06-05 01:11:11 +00:00
|
|
|
}
|