1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
// Generated by re2zig
// re2zig $INPUT -o $OUTPUT
const std = @import("std");
const yymaxfill = 1;
fn lex(str: []const u8) !i32 {
// Create a copy of the input string padded with yymaxfill zeroes at the end.
var yyinput = try std.testing.allocator.alloc(u8, str.len + yymaxfill);
defer std.testing.allocator.free(yyinput);
std.mem.copyForwards(u8, yyinput[0..], str);
std.mem.copyForwards(u8, yyinput[str.len..], &[_]u8{0} ** yymaxfill); // zero padding
var yycursor: usize = 0;
const yylimit: usize = yyinput.len;
var count: i32 = 0;
loop: while (true) {
var yych: u8 = 0;
var yystate: u32 = 0;
yyl: while (true) {
switch (yystate) {
0 => {
if (yylimit <= yycursor) { return -1; }
yych = yyinput[yycursor];
yycursor += 1;
switch (yych) {
0x00 => {
yystate = 1;
continue :yyl;
},
0x20 => {
yystate = 3;
continue :yyl;
},
0x27 => {
yystate = 5;
continue :yyl;
},
else => {
yystate = 2;
continue :yyl;
},
}
},
1 => {
// Check that it is the sentinel, not some unexpected null.
return if (yycursor - 1 == str.len) count else -1;
},
2 => { return -1; },
3 => {
if (yylimit <= yycursor) { return -1; }
yych = yyinput[yycursor];
switch (yych) {
0x20 => {
yycursor += 1;
yystate = 3;
continue :yyl;
},
else => {
yystate = 4;
continue :yyl;
},
}
},
4 => { continue :loop; },
5 => {
if (yylimit <= yycursor) { return -1; }
yych = yyinput[yycursor];
yycursor += 1;
switch (yych) {
0x27 => {
yystate = 6;
continue :yyl;
},
0x5C => {
yystate = 7;
continue :yyl;
},
else => {
yystate = 5;
continue :yyl;
},
}
},
6 => { count += 1; continue :loop; },
7 => {
if (yylimit <= yycursor) { return -1; }
yycursor += 1;
yystate = 5;
continue :yyl;
},
else => { @panic("internal lexer error"); },
}
}
}
}
test {
try std.testing.expectEqual(lex(""), 0);
try std.testing.expectEqual(lex("'qu\x00tes' 'are' 'fine: \\'' "), 3);
try std.testing.expectEqual(lex("'unterminated\\'"), -1);
try std.testing.expectEqual(lex("'unexpected \x00 null\\'"), -1);
}
|