mirror of
https://github.com/Ed94/WATL_Exercise.git
synced 2025-08-06 07:12:42 -07:00
finished watl draft impl (just need main now)
This commit is contained in:
@@ -2108,14 +2108,15 @@ void api_watl_parse(WATL_ParseInfo* info, Slice_WATL_Tok tokens, Opts_watl_parse
|
|||||||
info->signal |= WATL_ParseStatus_MemFail_SliceConstraintFail;
|
info->signal |= WATL_ParseStatus_MemFail_SliceConstraintFail;
|
||||||
WATL_ParseMsg* msg = alloc_type(opts->ainfo_msgs, WATL_ParseMsg);
|
WATL_ParseMsg* msg = alloc_type(opts->ainfo_msgs, WATL_ParseMsg);
|
||||||
msg->content = lit("Line slice allocation was not contiguous");
|
msg->content = lit("Line slice allocation was not contiguous");
|
||||||
msg->pos = (WATL_Pos){-1, -1};
|
msg->pos = (WATL_Pos){cast(S32, info->lines.len), cast(S32, line->len)};
|
||||||
|
msg->line = line;
|
||||||
|
msg->tok = token;
|
||||||
sll_queue_push_n(info->msgs, msg_last, msg, next);
|
sll_queue_push_n(info->msgs, msg_last, msg, next);
|
||||||
assert(opts->failon_slice_constraint_fail == false);
|
assert(opts->failon_slice_constraint_fail == false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
line = new_line;
|
line = new_line;
|
||||||
line->ptr = curr;
|
line->ptr = curr;
|
||||||
line->len = 0;
|
|
||||||
info->lines.len += 1;
|
info->lines.len += 1;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@@ -2136,7 +2137,6 @@ void api_watl_parse(WATL_ParseInfo* info, Slice_WATL_Tok tokens, Opts_watl_parse
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
curr = new_node;
|
curr = new_node;
|
||||||
* curr = (WATL_Node){0};
|
|
||||||
line->len += 1;
|
line->len += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@@ -1635,7 +1635,10 @@ api_watl_lex :: proc(info: ^WATL_LexInfo, source: string,
|
|||||||
case .Space: fallthrough
|
case .Space: fallthrough
|
||||||
case .Tab:
|
case .Tab:
|
||||||
if prev[0] != src_cursor[0] {
|
if prev[0] != src_cursor[0] {
|
||||||
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok { slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last); return }
|
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok {
|
||||||
|
slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last);
|
||||||
|
return
|
||||||
|
}
|
||||||
tok = new_tok
|
tok = new_tok
|
||||||
tok^ = transmute(Raw_String) slice(src_cursor, 0)
|
tok^ = transmute(Raw_String) slice(src_cursor, 0)
|
||||||
was_formatting = true
|
was_formatting = true
|
||||||
@@ -1644,14 +1647,20 @@ api_watl_lex :: proc(info: ^WATL_LexInfo, source: string,
|
|||||||
src_cursor = src_cursor[1:]
|
src_cursor = src_cursor[1:]
|
||||||
tok.len += 1
|
tok.len += 1
|
||||||
case .Line_Feed:
|
case .Line_Feed:
|
||||||
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok { slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last); return }
|
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok {
|
||||||
|
slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last);
|
||||||
|
return
|
||||||
|
}
|
||||||
tok = new_tok
|
tok = new_tok
|
||||||
tok^ = transmute(Raw_String) slice(src_cursor, 1)
|
tok^ = transmute(Raw_String) slice(src_cursor, 1)
|
||||||
src_cursor = src_cursor[1:]
|
src_cursor = src_cursor[1:]
|
||||||
was_formatting = true
|
was_formatting = true
|
||||||
num += 1
|
num += 1
|
||||||
case .Carriage_Return:
|
case .Carriage_Return:
|
||||||
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok { slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last); return }
|
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok {
|
||||||
|
slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last);
|
||||||
|
return
|
||||||
|
}
|
||||||
tok = new_tok
|
tok = new_tok
|
||||||
tok^ = transmute(Raw_String) slice(src_cursor, 2)
|
tok^ = transmute(Raw_String) slice(src_cursor, 2)
|
||||||
src_cursor = src_cursor[1:]
|
src_cursor = src_cursor[1:]
|
||||||
@@ -1659,7 +1668,10 @@ api_watl_lex :: proc(info: ^WATL_LexInfo, source: string,
|
|||||||
num += 1
|
num += 1
|
||||||
case:
|
case:
|
||||||
if (was_formatting) {
|
if (was_formatting) {
|
||||||
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok { slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last); return }
|
new_tok := alloc_tok(ainfo_toks); if cursor(new_tok)[-1:] != tok {
|
||||||
|
slice_constraint_fail(info, ainfo_msgs, new_tok, & msg_last);
|
||||||
|
return
|
||||||
|
}
|
||||||
tok = new_tok
|
tok = new_tok
|
||||||
tok^ = transmute(Raw_String) slice(src_cursor, 0)
|
tok^ = transmute(Raw_String) slice(src_cursor, 0)
|
||||||
was_formatting = false;
|
was_formatting = false;
|
||||||
@@ -1707,7 +1719,7 @@ WATL_ParseMsg :: struct {
|
|||||||
content: string,
|
content: string,
|
||||||
line: ^WATL_Line,
|
line: ^WATL_Line,
|
||||||
tok: ^WATL_Tok,
|
tok: ^WATL_Tok,
|
||||||
pos: ^WATL_Pos,
|
pos: WATL_Pos,
|
||||||
}
|
}
|
||||||
WATL_ParseStatus_Flag :: enum u32 {
|
WATL_ParseStatus_Flag :: enum u32 {
|
||||||
MemFail_SliceConstraintFail,
|
MemFail_SliceConstraintFail,
|
||||||
@@ -1724,7 +1736,59 @@ api_watl_parse :: proc(info: ^WATL_ParseInfo, tokens: []WATL_Tok,
|
|||||||
ainfo_lines: AllocatorInfo,
|
ainfo_lines: AllocatorInfo,
|
||||||
str_cache: ^Str8Cache,
|
str_cache: ^Str8Cache,
|
||||||
failon_slice_constraint_fail: b32,
|
failon_slice_constraint_fail: b32,
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
|
if len(tokens) == 0 do return
|
||||||
|
assert(ainfo_lines.procedure != nil)
|
||||||
|
assert(ainfo_msgs.procedure != nil)
|
||||||
|
assert(ainfo_nodes.procedure != nil)
|
||||||
|
assert(str_cache != nil)
|
||||||
|
msg_last: ^WATL_ParseMsg
|
||||||
|
|
||||||
|
info_lines := transmute(^SliceRaw(WATL_Node)) & info.lines
|
||||||
|
line := alloc_type(ainfo_lines, SliceRaw(WATL_Node))
|
||||||
|
curr := alloc_type(ainfo_nodes, WATL_Node)
|
||||||
|
line ^ = { transmute([^]WATL_Node) curr, 0 }
|
||||||
|
info_lines ^ = { transmute([^]WATL_Node) line, 0 }
|
||||||
|
for & token in tokens
|
||||||
|
{
|
||||||
|
#partial switch cast(WATL_TokKind) token[0]
|
||||||
|
{
|
||||||
|
case .Carriage_Return: fallthrough
|
||||||
|
case .Line_Feed:
|
||||||
|
new_line := alloc_type(ainfo_lines, WATL_Line); if cursor(new_line ^)[-1:] != line.data {
|
||||||
|
info.signal |= { .MemFail_SliceConstraintFail }
|
||||||
|
msg := alloc_type(ainfo_msgs, WATL_ParseMsg)
|
||||||
|
msg.content = "Line slice allocation was not contiguous"
|
||||||
|
msg.pos = { cast(i32) len(info.lines), cast(i32) line.len }
|
||||||
|
msg.line = transmute(^[]WATL_Node) line
|
||||||
|
msg.tok = & token
|
||||||
|
sll_queue_push_n(& info.msgs, & msg_last, & msg)
|
||||||
|
assert(failon_slice_constraint_fail == false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
line = transmute(^SliceRaw(WATL_Node)) new_line
|
||||||
|
line.data = curr
|
||||||
|
info_lines.len += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
case:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
curr ^ = cache_str8(str_cache, token)
|
||||||
|
new_node := alloc_type(ainfo_nodes, WATL_Node); if cursor(new_node)[-1:] != curr {
|
||||||
|
info.signal |= { .MemFail_SliceConstraintFail }
|
||||||
|
msg := alloc_type(ainfo_msgs, WATL_ParseMsg)
|
||||||
|
msg.content = "Nodes slice allocation was not contiguous"
|
||||||
|
msg.pos = { cast(i32) len(info.lines), cast(i32) line.len }
|
||||||
|
msg.line = transmute(^[]WATL_Node) line
|
||||||
|
msg.tok = & token
|
||||||
|
sll_queue_push_n(& info.msgs, & msg_last, & msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
line.len += 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
watl_parse_stack :: #force_inline proc(tokens: []WATL_Tok,
|
watl_parse_stack :: #force_inline proc(tokens: []WATL_Tok,
|
||||||
ainfo_msgs: AllocatorInfo,
|
ainfo_msgs: AllocatorInfo,
|
||||||
@@ -1744,6 +1808,32 @@ watl_parse_stack :: #force_inline proc(tokens: []WATL_Tok,
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
watl_dump_listing :: proc(buffer: AllocatorInfo, lines: []WATL_Line) -> string {
|
watl_dump_listing :: proc(buffer: AllocatorInfo, lines: []WATL_Line) -> string {
|
||||||
|
@static scratch : [Kilo * 64]byte; sarena := farena_make(scratch[:]); sinfo := ainfo(& sarena)
|
||||||
|
|
||||||
|
result := str8gen_make(buffer)
|
||||||
|
line_num : u32 = 0
|
||||||
|
for line in lines
|
||||||
|
{
|
||||||
|
str8gen_append_fmt(& result, "Line <line_num> - Chunks <chunk_num>:\n", {
|
||||||
|
{ "line_num", str8_from_u32(sinfo, line_num, 10, 0, 0) },
|
||||||
|
{ "chunk_num", str8_from_u32(sinfo, cast(u32) len(line), 10, 0, 0) }
|
||||||
|
})
|
||||||
|
for chunk in line
|
||||||
|
{
|
||||||
|
id : string
|
||||||
|
#partial switch cast(WATL_TokKind) chunk[0]
|
||||||
|
{
|
||||||
|
case .Space: id = "Space"
|
||||||
|
case .Tab: id = "Tab"
|
||||||
|
case: id = "Visible"
|
||||||
|
}
|
||||||
|
str8gen_append_fmt(& result, "\t<id>(<size>): '<chunk>'\n", {
|
||||||
|
{ "id", id },
|
||||||
|
{ "size", str8_from_u32(sinfo, cast(u32) len(chunk), 10, 0, 0) },
|
||||||
|
{ "chunk", chunk }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
//endregion WATL
|
//endregion WATL
|
||||||
|
Reference in New Issue
Block a user