new relexer starting to work

This commit is contained in:
Allen Webster 2016-06-06 00:02:20 -04:00
parent c9e40e492c
commit 428696d95e
3 changed files with 28 additions and 42 deletions

View File

@ -838,7 +838,8 @@ Job_Callback_Sig(job_full_lex){
return; return;
} }
system->grow_thread_memory(memory); system->grow_thread_memory(memory);
tokens.tokens = (Cpp_Token*)memory->data; lex.tb = (char*)memory->data;
tokens.tokens = (Cpp_Token*)((char*)memory->data + buffer_size);
tokens.max_count = memory->size / sizeof(Cpp_Token); tokens.max_count = memory->size / sizeof(Cpp_Token);
break; break;

View File

@ -1038,29 +1038,35 @@ cpp_relex_nonalloc_start(Cpp_File file, Cpp_Token_Stack *stack,
state.tolerance = tolerance; state.tolerance = tolerance;
Cpp_Get_Token_Result result = cpp_get_token(stack, start); Cpp_Get_Token_Result result = cpp_get_token(stack, start);
if (result.token_index <= 0){
state.start_token_i = 0;
}
else{
state.start_token_i = result.token_index-1; state.start_token_i = result.token_index-1;
if (state.start_token_i < 0){
state.start_token_i = 0;
} }
result = cpp_get_token(stack, end); result = cpp_get_token(stack, end);
if (result.token_index < 0) result.token_index = 0;
else if (end > stack->tokens[result.token_index].start) ++result.token_index;
state.end_token_i = result.token_index; state.end_token_i = result.token_index;
if (end > stack->tokens[state.end_token_i].start){
++state.end_token_i;
}
if (state.end_token_i < 0){
state.end_token_i = 0;
}
state.relex_start = stack->tokens[state.start_token_i].start; state.relex_start = stack->tokens[state.start_token_i].start;
if (start < state.relex_start) state.relex_start = start; if (start < state.relex_start){
state.relex_start = start;
}
state.space_request = state.end_token_i - state.start_token_i + tolerance + 1; state.space_request = state.end_token_i - state.start_token_i + tolerance + 1;
return(state); return(state);
} }
inline Cpp_Preprocessor_State inline char
cpp_token_get_pp_state(fcpp_u16 bitfield){ cpp_token_get_pp_state(fcpp_u16 bitfield){
return (Cpp_Preprocessor_State)(bitfield); return (char)(bitfield);
} }
// TODO(allen): Eliminate this once we actually store the EOF token // TODO(allen): Eliminate this once we actually store the EOF token
@ -1081,7 +1087,7 @@ cpp__get_token(Cpp_Token_Stack *stack, Cpp_Token *tokens, int size, int index){
return result; return result;
} }
FCPP_LINK bool FCPP_LINK int
cpp_relex_nonalloc_main(Cpp_Relex_State *state, cpp_relex_nonalloc_main(Cpp_Relex_State *state,
Cpp_Token_Stack *relex_stack, Cpp_Token_Stack *relex_stack,
int *relex_end, int *relex_end,
@ -1100,23 +1106,24 @@ cpp_relex_nonalloc_main(Cpp_Relex_State *state,
Cpp_Token end_token = match_token; Cpp_Token end_token = match_token;
int went_too_far = false; int went_too_far = false;
// TODO(allen): This can be better now I suspect. // TODO(allen): This can be better I suspect.
for (;;){ for (;;){
int result = int result =
cpp_lex_nonalloc(&lex, cpp_lex_size_nonalloc(&lex,
state->file.data, state->file.size, state->file.data,
stack, 1); state->file.size,
state->file.size,
relex_stack, 1);
switch (result){ switch (result){
case LexHitTokenLimit: case LexHitTokenLimit:
{ {
Cpp_Token token = Cpp_Token token = relex_stack->tokens[relex_stack->count-1];
stack->tokens[stack->count-1];
if (token.start == end_token.start && if (token.start == end_token.start &&
token.size == end_token.size && token.size == end_token.size &&
token.flags == end_token.flags && token.flags == end_token.flags &&
token.state_flags == end_token.state_flags){ token.state_flags == end_token.state_flags){
--stack->count; --relex_stack->count;
goto double_break; goto double_break;
} }
@ -1136,28 +1143,6 @@ cpp_relex_nonalloc_main(Cpp_Relex_State *state,
case LexFinished: case LexFinished:
goto double_break; goto double_break;
} }
#if 0
if (read.has_result){
if (read.token.start == end_token.start &&
read.token.size == end_token.size &&
read.token.flags == end_token.flags &&
read.token.state_flags == end_token.state_flags){
break;
}
cpp_push_token_nonalloc(relex_stack, read.token);
while (lex.pos > end_token.start && relex_end_i < stack->count){
++relex_end_i;
end_token = cpp__get_token(stack, tokens, state->file.size, relex_end_i);
}
if (relex_stack->count == relex_stack->max_count){
went_too_far = true;
break;
}
}
if (lex.pos >= state->file.size) break;
#endif
} }
double_break:; double_break:;
@ -1190,7 +1175,7 @@ cpp_relex_nonalloc_main(Cpp_Relex_State *state,
cpp_shift_token_starts(stack, state->end_token_i, -state->amount); cpp_shift_token_starts(stack, state->end_token_i, -state->amount);
} }
return went_too_far; return(went_too_far);
} }
#endif #endif

View File

@ -29,7 +29,7 @@
#include "system_shared.h" #include "system_shared.h"
#define SUPPORT_DPI 1 #define SUPPORT_DPI 1
#define USE_WIN32_FONTS 1 #define USE_WIN32_FONTS 0
#define FPS 60 #define FPS 60
#define frame_useconds (1000000 / FPS) #define frame_useconds (1000000 / FPS)