aboutsummaryrefslogtreecommitdiff
path: root/src/character.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/character.zig')
-rw-r--r--src/character.zig38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/character.zig b/src/character.zig
new file mode 100644
index 0000000..bd11ccd
--- /dev/null
+++ b/src/character.zig
@@ -0,0 +1,38 @@
+const std = @import("std");
+
+pub const Character = union(enum) {
+ const Self = @This();
+
+ pub const EPSILON: u8 = '_';
+ pub const END: u8 = 0;
+
+ epsilon: void,
+ terminal: u8,
+ non_terminal: u8,
+
+ pub fn from_u8(c: u8) Self {
+ if (c == '_') {
+ return Self { .epsilon = void{} };
+ } else if (std.ascii.isUpper(c)) {
+ return Self { .non_terminal = c };
+ } else {
+ return Self { .terminal = c };
+ }
+ }
+
+ pub fn format(
+ self: *const Self,
+ comptime fmt: []const u8,
+ options: std.fmt.FormatOptions,
+ writer: anytype,
+ ) !void {
+ _ = fmt;
+ _ = options;
+
+ switch (self.*) {
+ .epsilon => _ = try writer.writeAll("ε"),
+ .terminal => |c| try writer.writeByte(c),
+ .non_terminal => |c| try writer.writeByte(c),
+ }
+ }
+};