authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-04 23:25:59-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-04 23:25:59-05:00
log07898cc0dfae880b35bededa726c7e16a3c45f3d
tree293135e757f9599c93440dcf594df6d820cd7f4c
parent798dbe487b678a85c7e10b78c2424c4b3508475b

tokenizing string literals


1 files changed, 50 insertions(+), 1 deletions(-)

src-self-hosted/main.zig+50-1
......@@ -64,12 +64,15 @@ const Token = struct {
6464 return null;
6565 }
6666
67 const StrLitKind = enum {Normal, C};
6768
6869 const Id = union(enum) {
6970 Invalid,
7071 Identifier,
7172 Keyword: Keyword,
73 StringLiteral: StrLitKind,
7274 Eof,
75 Builtin,
7376 };
7477};
7578
......@@ -91,6 +94,10 @@ const Tokenizer = struct {
9194 const State = enum {
9295 Start,
9396 Identifier,
97 Builtin,
98 C,
99 StringLiteral,
100 StringLiteralBackslash,
94101 };
95102
96103 pub fn next(self: &Tokenizer) -> Token {
......@@ -107,10 +114,22 @@ const Tokenizer = struct {
107114 ' ', '\n' => {
108115 result.start = self.index + 1;
109116 },
110 'a'...'z', 'A'...'Z', '_' => {
117 'c' => {
118 state = State.C;
119 result.id = Token.Id { .Identifier = {} };
120 },
121 '"' => {
122 state = State.StringLiteral;
123 result.id = Token.Id { .StringLiteral = Token.StrLitKind.Normal };
124 },
125 'a'...'b', 'd'...'z', 'A'...'Z', '_' => {
111126 state = State.Identifier;
112127 result.id = Token.Id { .Identifier = {} };
113128 },
129 '@' => {
130 state = State.Builtin;
131 result.id = Token.Id { .Builtin = {} };
132 },
114133 else => {
115134 result.id = Token.Id { .Invalid = {} };
116135 self.index += 1;
......@@ -126,6 +145,36 @@ const Tokenizer = struct {
126145 break;
127146 },
128147 },
148 State.Builtin => switch (c) {
149 'a'...'z', 'A'...'Z', '_', '0'...'9' => {},
150 else => break,
151 },
152 State.C => switch (c) {
153 '\\' => @panic("TODO"),
154 '"' => {
155 state = State.StringLiteral;
156 result.id = Token.Id { .StringLiteral = Token.StrLitKind.C };
157 },
158 'a'...'z', 'A'...'Z', '_', '0'...'9' => {
159 state = State.Identifier;
160 },
161 else => break,
162 },
163 State.StringLiteral => switch (c) {
164 '\\' => {
165 state = State.StringLiteralBackslash;
166 },
167 '"' => {
168 self.index += 1;
169 break;
170 },
171 '\n' => break, // Look for this error later.
172 else => {},
173 },
174 State.StringLiteralBackslash => switch (c) {
175 '\n' => break, // Look for this error later.
176 else => {},
177 },
129178 }
130179 }
131180 result.end = self.index;