Token -> ControlToken
This commit is contained in:
parent
1340862c28
commit
802e6402bf
1 changed files with 15 additions and 15 deletions
|
@ -15,7 +15,7 @@ pub fn main() !void {
|
||||||
|
|
||||||
pub fn execute(writer: anytype, comptime template: []const u8, args: anytype) !void {
|
pub fn execute(writer: anytype, comptime template: []const u8, args: anytype) !void {
|
||||||
@setEvalBranchQuota(@intCast(u32, template.len * 8));
|
@setEvalBranchQuota(@intCast(u32, template.len * 8));
|
||||||
const tmpl = comptime parseTemplate(TokenIter{ .text = template }, .root);
|
const tmpl = comptime parseTemplate(ControlTokenIter{ .text = template }, .root);
|
||||||
try executeTemplate(writer, tmpl.item, args, .{});
|
try executeTemplate(writer, tmpl.item, args, .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ const TemplateType = enum {
|
||||||
if_block,
|
if_block,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn parseTemplate(comptime tokens: TokenIter, comptime template_type: TemplateType) ParseResult(TokenIter, []const TemplateItem) {
|
fn parseTemplate(comptime tokens: ControlTokenIter, comptime template_type: TemplateType) ParseResult(ControlTokenIter, []const TemplateItem) {
|
||||||
comptime {
|
comptime {
|
||||||
var iter = tokens;
|
var iter = tokens;
|
||||||
var items: []const TemplateItem = &.{};
|
var items: []const TemplateItem = &.{};
|
||||||
|
@ -177,7 +177,7 @@ fn parseTemplate(comptime tokens: TokenIter, comptime template_type: TemplateTyp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parseExpression(comptime tokens: TokenIter) ParseResult(TokenIter, Expression) {
|
fn parseExpression(comptime tokens: ControlTokenIter) ParseResult(ControlTokenIter, Expression) {
|
||||||
comptime {
|
comptime {
|
||||||
var iter = tokens;
|
var iter = tokens;
|
||||||
|
|
||||||
|
@ -203,7 +203,7 @@ fn parseExpression(comptime tokens: TokenIter) ParseResult(TokenIter, Expression
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parseControlBlock(comptime tokens: TokenIter) ParseResult(TokenIter, ControlBlock) {
|
fn parseControlBlock(comptime tokens: ControlTokenIter) ParseResult(ControlTokenIter, ControlBlock) {
|
||||||
comptime {
|
comptime {
|
||||||
var iter = tokens;
|
var iter = tokens;
|
||||||
var first_token: bool = true;
|
var first_token: bool = true;
|
||||||
|
@ -303,7 +303,7 @@ fn parseControlBlock(comptime tokens: TokenIter) ParseResult(TokenIter, ControlB
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn skipWhitespace(comptime tokens: TokenIter) TokenIter {
|
fn skipWhitespace(comptime tokens: ControlTokenIter) ControlTokenIter {
|
||||||
comptime {
|
comptime {
|
||||||
var iter = tokens;
|
var iter = tokens;
|
||||||
while (iter.peek()) |token| switch (token) {
|
while (iter.peek()) |token| switch (token) {
|
||||||
|
@ -315,7 +315,7 @@ fn skipWhitespace(comptime tokens: TokenIter) TokenIter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn endControlBlock(comptime tokens: TokenIter) TokenIter {
|
fn endControlBlock(comptime tokens: ControlTokenIter) ControlTokenIter {
|
||||||
comptime {
|
comptime {
|
||||||
var iter = skipWhitespace(tokens);
|
var iter = skipWhitespace(tokens);
|
||||||
|
|
||||||
|
@ -325,7 +325,7 @@ fn endControlBlock(comptime tokens: TokenIter) TokenIter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parseForLoop(comptime tokens: TokenIter) ParseResult(TokenIter, ForLoop) {
|
fn parseForLoop(comptime tokens: ControlTokenIter) ParseResult(ControlTokenIter, ForLoop) {
|
||||||
comptime {
|
comptime {
|
||||||
const iterable = parseExpression(tokens);
|
const iterable = parseExpression(tokens);
|
||||||
var iter = iterable.new_iter;
|
var iter = iterable.new_iter;
|
||||||
|
@ -360,7 +360,7 @@ fn parseForLoop(comptime tokens: TokenIter) ParseResult(TokenIter, ForLoop) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parseIfStatement(comptime tokens: TokenIter) ParseResult(TokenIter, IfStatement) {
|
fn parseIfStatement(comptime tokens: ControlTokenIter) ParseResult(ControlTokenIter, IfStatement) {
|
||||||
comptime {
|
comptime {
|
||||||
const condition = parseExpression(tokens);
|
const condition = parseExpression(tokens);
|
||||||
var iter = endControlBlock(condition.new_iter);
|
var iter = endControlBlock(condition.new_iter);
|
||||||
|
@ -371,7 +371,7 @@ fn parseIfStatement(comptime tokens: TokenIter) ParseResult(TokenIter, IfStateme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parseDeref(comptime tokens: TokenIter) ParseResult(TokenIter, []const []const u8) {
|
fn parseDeref(comptime tokens: ControlTokenIter) ParseResult(ControlTokenIter, []const []const u8) {
|
||||||
comptime {
|
comptime {
|
||||||
var iter = tokens;
|
var iter = tokens;
|
||||||
var fields: []const []const u8 = &.{};
|
var fields: []const []const u8 = &.{};
|
||||||
|
@ -450,7 +450,7 @@ const EndKeyword = enum {
|
||||||
@"if",
|
@"if",
|
||||||
};
|
};
|
||||||
|
|
||||||
const Token = union(enum) {
|
const ControlToken = union(enum) {
|
||||||
text: []const u8,
|
text: []const u8,
|
||||||
open_bracket: void,
|
open_bracket: void,
|
||||||
close_bracket: void,
|
close_bracket: void,
|
||||||
|
@ -463,14 +463,14 @@ const Token = union(enum) {
|
||||||
equals: void,
|
equals: void,
|
||||||
};
|
};
|
||||||
|
|
||||||
const TokenIter = struct {
|
const ControlTokenIter = struct {
|
||||||
start: usize = 0,
|
start: usize = 0,
|
||||||
text: []const u8,
|
text: []const u8,
|
||||||
peeked_token: ?Token = null,
|
peeked_token: ?ControlToken = null,
|
||||||
|
|
||||||
row: usize = 0,
|
row: usize = 0,
|
||||||
|
|
||||||
fn next(self: *TokenIter) ?Token {
|
fn next(self: *ControlTokenIter) ?ControlToken {
|
||||||
if (self.peeked_token) |token| {
|
if (self.peeked_token) |token| {
|
||||||
self.peeked_token = null;
|
self.peeked_token = null;
|
||||||
return token;
|
return token;
|
||||||
|
@ -509,13 +509,13 @@ const TokenIter = struct {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn peek(self: *TokenIter) ?Token {
|
fn peek(self: *ControlTokenIter) ?ControlToken {
|
||||||
const token = self.next();
|
const token = self.next();
|
||||||
self.peeked_token = token;
|
self.peeked_token = token;
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn putBack(self: *TokenIter, token: Token) void {
|
fn putBack(self: *ControlTokenIter, token: ControlToken) void {
|
||||||
std.debug.assert(self.peeked_token == null);
|
std.debug.assert(self.peeked_token == null);
|
||||||
self.peeked_token = token;
|
self.peeked_token = token;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue