Skip to content

Instantly share code, notes, and snippets.

@terickson001
Last active March 5, 2024 20:20
Show Gist options
  • Save terickson001/d0a411db7494af7ebd92715452ec388f to your computer and use it in GitHub Desktop.
Save terickson001/d0a411db7494af7ebd92715452ec388f to your computer and use it in GitHub Desktop.
Optional Semicolons for Odin in 4coder
function Code_Index_Nest *odin_parse_statement(Code_Index_File *index, Generic_Parse_State *state)
{
Token *token = token_it_read(&state->it);
Code_Index_Nest *result = push_array_zero(state->arena, Code_Index_Nest, 1);
result->kind = CodeIndexNest_Statement;
result->open = Ii64(token->pos);
result->close = Ii64(max_i64);
result->file = index;
u8 check_buffer[1024] = {0};
buffer_read_range(state->app, index->buffer, Ii64(token), check_buffer);
state->in_statement = true;
Token *prev_non_whitespace = token;
for (;;){
token = token_it_read(&state->it);
buffer_read_range(state->app, index->buffer, Ii64(token), check_buffer);
check_buffer[range_size(Ii64(token))] = 0;
if (token->sub_kind == TokenOdinKind_EOL && (odin_insert_semicolon(prev_non_whitespace) || prev_non_whitespace == token)) {
result->is_closed = true;
result->close = Ii64(token);
generic_parse_inc(state);
break;
}
generic_parse_skip_soft_tokens(index, state);
token = token_it_read(&state->it);
prev_non_whitespace = token;
buffer_read_range(state->app, index->buffer, Ii64(token), check_buffer);
check_buffer[range_size(Ii64(token))] = 0;
if (token == 0 || state->finished){
break;
}
if (state->in_preprocessor){
if (!HasFlag(token->flags, TokenBaseFlag_PreprocessorBody) ||
token->kind == TokenBaseKind_Preprocessor){
result->is_closed = true;
result->close = Ii64(token->pos);
break;
}
}
else{
if (token->kind == TokenBaseKind_Preprocessor){
result->is_closed = true;
result->close = Ii64(token->pos);
break;
}
}
if (token->kind == TokenBaseKind_ScopeOpen ||
token->kind == TokenBaseKind_ScopeClose ||
token->kind == TokenBaseKind_ParentheticalOpen){
result->is_closed = true;
result->close = Ii64(token->pos);
break;
}
if (token->kind == TokenBaseKind_StatementClose) {
result->is_closed = true;
result->close = Ii64(token);
generic_parse_inc(state);
break;
}
generic_parse_inc(state);
}
state->in_statement = false;
return(result);
}
function b32 odin_insert_semicolon(Token *token)
{
switch (token->sub_kind)
{
case TokenOdinKind_Identifier:
case TokenOdinKind_context:
case TokenOdinKind_typeid:
case TokenOdinKind_break:
case TokenOdinKind_continue:
case TokenOdinKind_fallthrough:
case TokenOdinKind_return:
case TokenOdinKind_LiteralInteger:
case TokenOdinKind_LiteralIntegerHex:
case TokenOdinKind_LiteralIntegerOct:
case TokenOdinKind_LiteralIntegerDoz:
case TokenOdinKind_LiteralIntegerBin:
case TokenOdinKind_LiteralFloat:
case TokenOdinKind_LiteralString:
case TokenOdinKind_LiteralStringRaw:
case TokenOdinKind_LiteralCharacter:
case TokenOdinKind_Ternary:
case TokenOdinKind_Carrot:
case TokenOdinKind_ParenCl:
case TokenOdinKind_BrackCl:
case TokenOdinKind_BraceCl:
return true;
default:
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment