test cases for ambiguous statics across many units; comments in exprs

This commit is contained in:
Ryan Fleury
2026-04-22 12:44:18 -07:00
parent 86066018e7
commit d2eb9628ba
8 changed files with 89 additions and 122 deletions
+1
View File
@@ -10,6 +10,7 @@ E_TokenKindTable:
{StringLiteral}
{CharLiteral}
{Symbol}
{Comment}
}
@table(name basic_string basic_byte_size)
+49 -101
View File
@@ -74,6 +74,7 @@ e_token_array_from_text(Arena *arena, String8 text)
B32 active_token_kind_started_with_tick = 0;
B32 escaped = 0;
B32 exp = 0;
B32 comment_is_explicit_ender = 0;
for(U64 idx = 0, advance = 0; idx <= text.size; idx += advance)
{
U8 byte = (idx+0 < text.size) ? text.str[idx+0] : 0;
@@ -114,11 +115,23 @@ e_token_array_from_text(Arena *arena, String8 text)
byte == ']' || byte == '{' || byte == '}' || byte == ':' ||
byte == ';' || byte == ',' || byte == '.' || byte == '<' ||
byte == '>' || byte == '/' || byte == '?' || byte == '|' ||
byte == '#')
byte == '#' || byte == '@')
{
active_token_kind = E_TokenKind_Symbol;
active_token_start_idx = idx;
}
else if(byte == '/' && byte_next == '/')
{
active_token_kind = E_TokenKind_Comment;
active_token_start_idx = idx;
comment_is_explicit_ender = 0;
}
else if(byte == '/' && byte_next == '*')
{
active_token_kind = E_TokenKind_Comment;
active_token_start_idx = idx;
comment_is_explicit_ender = 1;
}
}break;
//- rjf: active tokens -> seek enders
@@ -226,12 +239,24 @@ e_token_array_from_text(Arena *arena, String8 text)
byte != ']' && byte != '{' && byte != '}' && byte != ':' &&
byte != ';' && byte != ',' && byte != '.' && byte != '<' &&
byte != '>' && byte != '/' && byte != '?' && byte != '|' &&
byte != '#')
byte != '#' && byte != '@')
{
advance = 0;
token_formed = 1;
}
}break;
case E_TokenKind_Comment:
{
if(byte == 0)
{
token_formed = 1;
}
else if(comment_is_explicit_ender && byte == '*' && byte_next == '/')
{
token_formed = 1;
advance = 2;
}
}break;
}
//- rjf: token formed -> push new formed token(s)
@@ -650,97 +675,6 @@ e_type_key_from_expr(E_Expr *expr)
return result;
}
internal E_Parse
e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens)
{
E_Parse parse = {tokens, 0, &e_expr_nil, &e_expr_nil};
E_Token *token_it = tokens.v;
//- rjf: parse unsigned marker
B32 unsigned_marker = 0;
{
E_Token token = e_token_at_it(token_it, &tokens);
if(token.kind == E_TokenKind_Identifier)
{
String8 token_string = str8_substr(text, token.range);
if(str8_match(token_string, str8_lit("unsigned"), 0))
{
token_it += 1;
unsigned_marker = 1;
}
}
}
//- rjf: parse base type
{
E_Token token = e_token_at_it(token_it, &tokens);
if(token.kind == E_TokenKind_Identifier)
{
String8 token_string = str8_substr(text, token.range);
if(token_string.size >= 2 &&
token_string.str[0] == '`' &&
token_string.str[token_string.size-1] == '`')
{
token_string = str8_substr(token_string, r1u64(1, token_string.size-1));
}
E_TypeKey type_key = e_leaf_type_key_from_name(token_string);
if(!e_type_key_match(e_type_key_zero(), type_key))
{
token_it += 1;
// rjf: apply unsigned marker to base type
if(unsigned_marker) switch(e_type_kind_from_key(type_key))
{
default:{}break;
case E_TypeKind_Char8: {type_key = e_type_key_basic(E_TypeKind_UChar8);}break;
case E_TypeKind_Char16:{type_key = e_type_key_basic(E_TypeKind_UChar16);}break;
case E_TypeKind_Char32:{type_key = e_type_key_basic(E_TypeKind_UChar32);}break;
case E_TypeKind_S8: {type_key = e_type_key_basic(E_TypeKind_U8);}break;
case E_TypeKind_S16: {type_key = e_type_key_basic(E_TypeKind_U16);}break;
case E_TypeKind_S32: {type_key = e_type_key_basic(E_TypeKind_U32);}break;
case E_TypeKind_S64: {type_key = e_type_key_basic(E_TypeKind_U64);}break;
case E_TypeKind_S128:{type_key = e_type_key_basic(E_TypeKind_U128);}break;
case E_TypeKind_S256:{type_key = e_type_key_basic(E_TypeKind_U256);}break;
case E_TypeKind_S512:{type_key = e_type_key_basic(E_TypeKind_U512);}break;
}
// rjf: construct leaf type
parse.expr = e_push_expr(arena, E_ExprKind_TypeIdent, token.range);
parse.expr->type_key = type_key;
}
}
}
//- rjf: parse extensions
if(parse.expr != &e_expr_nil)
{
for(;;)
{
E_Token token = e_token_at_it(token_it, &tokens);
if(token.kind != E_TokenKind_Symbol)
{
break;
}
String8 token_string = str8_substr(text, token.range);
if(str8_match(token_string, str8_lit("*"), 0))
{
token_it += 1;
E_Expr *ptee = parse.expr;
parse.expr = e_push_expr(arena, E_ExprKind_Ptr, token.range);
e_expr_push_child(parse.expr, ptee);
}
else
{
break;
}
}
}
//- rjf: fill parse & end
parse.last_token = token_it;
return parse;
}
internal E_Parse
e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count)
{
@@ -847,14 +781,14 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t
}
// rjf: try 'unsigned' marker
if(str8_match(token_string, str8_lit("unsigned"), 0))
if(token.kind == E_TokenKind_Identifier && str8_match(token_string, str8_lit("unsigned"), 0))
{
prefix_unary_kind = E_ExprKind_Unsigned;
prefix_unary_precedence = 2;
}
// rjf: try explicit cast
if(str8_match(token_string, str8_lit("cast"), 0))
if(token.kind == E_TokenKind_Identifier && str8_match(token_string, str8_lit("cast"), 0))
{
// rjf: consume cast & open paren
E_Token open_paren_maybe = e_token_at_it(it+1, &tokens);
@@ -923,14 +857,28 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t
{
E_Token token = e_token_at_it(it, &tokens);
String8 token_string = str8_substr(text, token.range);
if(token.kind == E_TokenKind_Identifier)
if(token.kind == E_TokenKind_Identifier || token.kind == E_TokenKind_StringLiteral)
{
E_Token next_token = e_token_at_it(it+1, &tokens);
String8 next_token_string = str8_substr(text, next_token.range);
if(next_token.range.min == token.range.max && next_token.kind == E_TokenKind_Symbol && str8_match(next_token_string, str8_lit(":"), 0))
// rjf: look for extensions - for qualifiers of the form `foo.dll!bar`
U64 token_ext_count = 0;
E_Token dot_maybe_token = e_token_at_it(it+1, &tokens);
String8 dot_maybe_token_string = str8_substr(text, dot_maybe_token.range);
E_Token ext_maybe_token = e_token_at_it(it+2, &tokens);
String8 ext_maybe_token_string = str8_substr(text, ext_maybe_token.range);
if(dot_maybe_token.kind == E_TokenKind_Symbol &&
ext_maybe_token.kind == E_TokenKind_Identifier &&
str8_match(dot_maybe_token_string, str8_lit("."), 0))
{
it += 2;
resolution_qualifier = token_string;
token_ext_count = 2;
}
// rjf: look for : or !
E_Token next_token = e_token_at_it(it+1+token_ext_count, &tokens);
String8 next_token_string = str8_substr(text, next_token.range);
if(next_token.kind == E_TokenKind_Symbol && (str8_match(next_token_string, str8_lit(":"), 0) || str8_match(next_token_string, str8_lit("!"), 0)))
{
it += 2 + token_ext_count;
resolution_qualifier = str8_substr(text, union_1u64(token.range, r1u64(token.range.min, next_token.range.min)));
}
}
}
-1
View File
@@ -37,7 +37,6 @@ internal String8 e_string_from_expr(Arena *arena, E_Expr *expr, String8 parent_e
internal E_TypeKey e_leaf_builtin_type_key_from_name(String8 name);
internal E_TypeKey e_leaf_type_key_from_name(String8 name);
internal E_TypeKey e_type_key_from_expr(E_Expr *expr);
internal E_Parse e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens);
internal E_Parse e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count);
internal E_Parse e_push_parse_from_string(Arena *arena, String8 text);
+2 -1
View File
@@ -4,7 +4,7 @@
//- GENERATED CODE
C_LINKAGE_BEGIN
String8 e_token_kind_strings[6] =
String8 e_token_kind_strings[7] =
{
str8_lit_comp("Null"),
str8_lit_comp("Identifier"),
@@ -12,6 +12,7 @@ str8_lit_comp("Numeric"),
str8_lit_comp("StringLiteral"),
str8_lit_comp("CharLiteral"),
str8_lit_comp("Symbol"),
str8_lit_comp("Comment"),
};
String8 e_type_kind_basic_string_table[61] =
+2 -1
View File
@@ -14,6 +14,7 @@ E_TokenKind_Numeric,
E_TokenKind_StringLiteral,
E_TokenKind_CharLiteral,
E_TokenKind_Symbol,
E_TokenKind_Comment,
E_TokenKind_COUNT,
} E_TokenKind;
@@ -168,7 +169,7 @@ E_InterpretationCode_COUNT,
} E_InterpretationCode;
C_LINKAGE_BEGIN
extern String8 e_token_kind_strings[6];
extern String8 e_token_kind_strings[7];
extern String8 e_type_kind_basic_string_table[61];
extern U8 e_type_kind_basic_byte_size_table[61];
extern String8 e_expr_kind_strings[50];