2019-06-05 23:29:03 +00:00
|
|
|
const tokens = @import("tokens.zig");
|
|
|
|
const Token = tokens.Token;
|
|
|
|
|
|
|
|
pub const ExprType = enum {
|
|
|
|
Unary,
|
|
|
|
Binary,
|
|
|
|
Grouping,
|
2019-06-05 02:44:27 +00:00
|
|
|
Number,
|
2019-06-06 01:06:12 +00:00
|
|
|
Bool,
|
|
|
|
Nil,
|
|
|
|
String,
|
2019-06-05 01:11:11 +00:00
|
|
|
};
|
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
pub const Expr = union(ExprType) {
|
|
|
|
Unary: UnaryExpr,
|
|
|
|
Binary: BinaryExpr,
|
|
|
|
Grouping: Grouping,
|
|
|
|
Number: Number,
|
2019-06-06 01:06:12 +00:00
|
|
|
Bool: Bool,
|
|
|
|
Nil: Nil,
|
|
|
|
String: String,
|
2019-06-05 02:44:27 +00:00
|
|
|
};
|
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
pub const UnaryExpr = struct {
|
|
|
|
operator: Token,
|
|
|
|
right: *Expr,
|
2019-06-05 02:44:27 +00:00
|
|
|
};
|
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
pub fn mkUnary(operator: Token, right: *Expr) Expr {
|
|
|
|
return Expr{
|
|
|
|
.Unary = UnaryExpr{
|
|
|
|
.operator = operator,
|
|
|
|
.right = right,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
2019-06-05 02:44:27 +00:00
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
pub const BinaryExpr = struct {
|
|
|
|
left: *Expr,
|
|
|
|
operator: Token,
|
|
|
|
right: *Expr,
|
2019-06-05 02:44:27 +00:00
|
|
|
};
|
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
pub fn mkBinary(left: *Expr, operator: Token, right: *Expr) Expr {
|
|
|
|
return Expr{
|
|
|
|
.Binary = BinaryExpr{
|
|
|
|
.left = left,
|
|
|
|
.operator = operator,
|
|
|
|
.right = right,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
pub const Grouping = struct {
|
|
|
|
expression: *Expr,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub fn mkGrouping(expression: *Expr) Expr {
|
|
|
|
return Expr{
|
|
|
|
.Grouping = Grouping{
|
|
|
|
.expression = expression,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Represents the default number literals in V.
|
2019-06-05 02:44:27 +00:00
|
|
|
pub const NumberType = enum {
|
|
|
|
Integer32,
|
|
|
|
Integer64,
|
|
|
|
Unsigned32,
|
|
|
|
Unsigned64,
|
|
|
|
Float32,
|
|
|
|
Float64,
|
|
|
|
};
|
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
/// "translation" of V number types to Zig number types for nicer
|
|
|
|
/// representation.
|
|
|
|
pub const Number = union(NumberType) {
|
2019-06-05 02:44:27 +00:00
|
|
|
Integer32: i32,
|
|
|
|
Integer64: i64,
|
|
|
|
Unsigned32: u32,
|
|
|
|
Unsigned64: u64,
|
|
|
|
Float32: f32,
|
|
|
|
Float64: f64,
|
2019-06-05 01:11:11 +00:00
|
|
|
};
|
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
pub fn mkNum(comptime T: type, num: T) Expr {
|
|
|
|
var expr = switch (T) {
|
|
|
|
i32 => Expr{ .Number = Number{ .Integer32 = num } },
|
|
|
|
i64 => Expr{ .Number = Number{ .Integer64 = num } },
|
|
|
|
u32 => Expr{ .Number = Number{ .Unsigned32 = num } },
|
|
|
|
u64 => Expr{ .Number = Number{ .Unsigned64 = num } },
|
|
|
|
f32 => Expr{ .Number = Number{ .Float32 = num } },
|
|
|
|
f64 => Expr{ .Number = Number{ .Float64 = num } },
|
|
|
|
else => unreachable,
|
|
|
|
};
|
2019-06-05 02:44:27 +00:00
|
|
|
|
2019-06-05 23:29:03 +00:00
|
|
|
return expr;
|
2019-06-05 01:11:11 +00:00
|
|
|
}
|
2019-06-06 01:06:12 +00:00
|
|
|
|
|
|
|
pub const Bool = bool;
|
|
|
|
pub const Nil = void;
|
|
|
|
pub const String = []u8;
|