Compare commits

..

No commits in common. "1e7fdcec166fe7faaa145f9778e41145b2676574" and "441a46daaa8d8259f4634c476db6ec76bd876434" have entirely different histories.

8 changed files with 723 additions and 887 deletions

View File

@ -3,8 +3,8 @@
#include "code_serialization.cpp" #include "code_serialization.cpp"
#endif #endif
internal void parser_init(Context* ctx); internal void parser_init();
internal void parser_deinit(Context* ctx); internal void parser_deinit();
internal internal
void* fallback_allocator_proc( void* allocator_data, AllocType type, ssize size, ssize alignment, void* old_memory, ssize old_size, u64 flags ) void* fallback_allocator_proc( void* allocator_data, AllocType type, ssize size, ssize alignment, void* old_memory, ssize old_size, u64 flags )
@ -343,7 +343,7 @@ void init(Context* ctx)
} }
define_constants(); define_constants();
parser_init(ctx); parser_init();
++ context_counter; ++ context_counter;
} }
@ -392,7 +392,7 @@ void deinit(Context* ctx)
while ( left--, left ); while ( left--, left );
array_free( ctx->Fallback_AllocatorBuckets); array_free( ctx->Fallback_AllocatorBuckets);
} }
parser_deinit(ctx); parser_deinit();
if (_ctx == ctx) if (_ctx == ctx)
_ctx = nullptr; _ctx = nullptr;

View File

@ -15,6 +15,38 @@
\ \\ \ \\ \ \ \\ \ \ \ \ \ \\ \ \\ \ \ \\ \ \ \ \
*/ */
enum LogLevel //: u32
{
LL_Null,
LL_Note,
LL_Warning,
LL_Error,
LL_Fatal,
LL_UnderlyingType = GEN_U32_MAX,
};
typedef enum LogLevel LogLevel;
Str loglevel_to_str(LogLevel level)
{
local_persist
Str lookup[] = {
{ "Null", sizeof("Null") - 1 },
{ "Note", sizeof("Note") - 1 },
{ "Warning", sizeof("Info") - 1 },
{ "Error", sizeof("Error") - 1 },
{ "Fatal", sizeof("Fatal") - 1 },
};
return lookup[level];
}
struct LogEntry
{
Str msg;
LogLevel level;
};
typedef void LoggerProc(LogEntry entry);
// Note(Ed): This is subject to heavily change // Note(Ed): This is subject to heavily change
// with upcoming changes to the library's fallback (default) allocations strategy; // with upcoming changes to the library's fallback (default) allocations strategy;
// and major changes to lexer/parser context usage. // and major changes to lexer/parser context usage.
@ -379,7 +411,7 @@ struct ParseMessage
{ {
ParseMessage* Next; ParseMessage* Next;
ParseStackNode* Scope; ParseStackNode* Scope;
Str Content; Str Log;
LogLevel Level; LogLevel Level;
}; };

View File

@ -10,9 +10,6 @@
ParseInfo wip_parse_str(LexedInfo lexed, ParseOpts* opts) ParseInfo wip_parse_str(LexedInfo lexed, ParseOpts* opts)
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
TokArray toks; TokArray toks;
if (lexed.tokens.Num == 0 && lexed.tokens.Ptr == nullptr) { if (lexed.tokens.Num == 0 && lexed.tokens.Ptr == nullptr) {
check_parse_args(lexed.text); check_parse_args(lexed.text);
@ -26,44 +23,31 @@ ParseInfo wip_parse_str(LexedInfo lexed, ParseOpts* opts)
// TODO(Ed): ParseInfo should be set to the parser context. // TODO(Ed): ParseInfo should be set to the parser context.
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
push_scope();
CodeBody result = parse_global_nspace(CT_Global_Body);
parser_pop(& _ctx->parser);
ParseStackNode scope = NullScope;
parser_push(& ctx->parser, & scope);
CodeBody result = parse_global_nspace(ctx,CT_Global_Body);
parser_pop(& ctx->parser);
return info; return info;
} }
CodeClass parse_class( Str def ) CodeClass parse_class( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
push_scope();
ParseStackNode scope = NullScope; CodeClass result = (CodeClass) parse_class_struct( Tok_Decl_Class, parser_not_inplace_def );
parser_push(& ctx->parser, & scope); parser_pop(& _ctx->parser);
CodeClass result = (CodeClass) parse_class_struct( ctx, Tok_Decl_Class, parser_not_inplace_def );
parser_pop(& ctx->parser);
return result; return result;
} }
CodeConstructor parse_constructor(Str def ) CodeConstructor parse_constructor( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
@ -96,8 +80,8 @@ CodeConstructor parse_constructor(Str def )
break; break;
default : default :
log_failure( "Invalid specifier %s for variable\n%S", spec_to_str( spec ), parser_to_strbuilder(ctx->parser, ctx->Allocator_Temp) ); log_failure( "Invalid specifier %s for variable\n%S", spec_to_str( spec ), parser_to_strbuilder(_ctx->parser) );
parser_pop(& ctx->parser); parser_pop(& _ctx->parser);
return InvalidCode; return InvalidCode;
} }
@ -116,38 +100,28 @@ CodeConstructor parse_constructor(Str def )
// <specifiers> ... // <specifiers> ...
} }
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
CodeConstructor result = parser_parse_constructor(ctx, specifiers); CodeConstructor result = parser_parse_constructor( specifiers );
return result; return result;
} }
CodeDefine parse_define( Str def ) CodeDefine parse_define( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
push_scope();
ParseStackNode scope = NullScope; CodeDefine result = parser_parse_define();
parser_push(& ctx->parser, & scope); parser_pop(& _ctx->parser);
CodeDefine result = parser_parse_define(ctx);
parser_pop(& ctx->parser);
return result; return result;
} }
CodeDestructor parse_destructor( Str def ) CodeDestructor parse_destructor( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
@ -157,269 +131,210 @@ CodeDestructor parse_destructor( Str def )
// TODO(Ed): Destructors can have prefix attributes // TODO(Ed): Destructors can have prefix attributes
// TODO(Ed): Destructors can have virtual // TODO(Ed): Destructors can have virtual
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
CodeDestructor result = parser_parse_destructor(ctx, NullCode); CodeDestructor result = parser_parse_destructor(NullCode);
return result; return result;
} }
CodeEnum parse_enum( Str def ) CodeEnum parse_enum( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
ParseStackNode scope = NullScope;
parser_push(& ctx->parser, & scope);
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
{ {
parser_pop(& ctx->parser); parser_pop(& _ctx->parser);
return InvalidCode; return InvalidCode;
} }
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_enum(ctx, parser_not_inplace_def); return parser_parse_enum( parser_not_inplace_def);
} }
CodeBody parse_export_body( Str def ) CodeBody parse_export_body( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_export_body(ctx); return parser_parse_export_body();
} }
CodeExtern parse_extern_link( Str def ) CodeExtern parse_extern_link( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_extern_link(ctx); return parser_parse_extern_link();
} }
CodeFriend parse_friend( Str def ) CodeFriend parse_friend( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_friend(ctx); return parser_parse_friend();
} }
CodeFn parse_function( Str def ) CodeFn parse_function( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return (CodeFn) parser_parse_function(ctx); return (CodeFn) parser_parse_function();
} }
CodeBody parse_global_body( Str def ) CodeBody parse_global_body( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
push_scope();
ParseStackNode scope = NullScope; CodeBody result = parse_global_nspace( CT_Global_Body );
parser_push(& ctx->parser, & scope); parser_pop(& _ctx->parser);
CodeBody result = parse_global_nspace(ctx, CT_Global_Body );
parser_pop(& ctx->parser);
return result; return result;
} }
CodeNS parse_namespace( Str def ) CodeNS parse_namespace( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_namespace(ctx); return parser_parse_namespace();
} }
CodeOperator parse_operator( Str def ) CodeOperator parse_operator( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return (CodeOperator) parser_parse_operator(ctx); return (CodeOperator) parser_parse_operator();
} }
CodeOpCast parse_operator_cast( Str def ) CodeOpCast parse_operator_cast( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_operator_cast(ctx, NullCode); return parser_parse_operator_cast(NullCode);
} }
CodeStruct parse_struct( Str def ) CodeStruct parse_struct( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
push_scope();
ParseStackNode scope = NullScope; CodeStruct result = (CodeStruct) parse_class_struct( Tok_Decl_Struct, parser_not_inplace_def );
parser_push(& ctx->parser, & scope); parser_pop(& _ctx->parser);
CodeStruct result = (CodeStruct) parse_class_struct( ctx, Tok_Decl_Struct, parser_not_inplace_def );
parser_pop(& ctx->parser);
return result; return result;
} }
CodeTemplate parse_template( Str def ) CodeTemplate parse_template( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_template(ctx); return parser_parse_template();
} }
CodeTypename parse_type( Str def ) CodeTypename parse_type( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_type( ctx, parser_not_from_template, nullptr); return parser_parse_type( parser_not_from_template, nullptr);
} }
CodeTypedef parse_typedef( Str def ) CodeTypedef parse_typedef( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_typedef(ctx); return parser_parse_typedef();
} }
CodeUnion parse_union( Str def ) CodeUnion parse_union( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_union(ctx, parser_not_inplace_def); return parser_parse_union( parser_not_inplace_def);
} }
CodeUsing parse_using( Str def ) CodeUsing parse_using( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_using(ctx); return parser_parse_using();
} }
CodeVar parse_variable( Str def ) CodeVar parse_variable( Str def )
{ {
// TODO(Ed): Lift this.
Context* ctx = _ctx;
check_parse_args( def ); check_parse_args( def );
TokArray toks = lex( def ); TokArray toks = lex( def );
if ( toks.Arr == nullptr ) if ( toks.Arr == nullptr )
return InvalidCode; return InvalidCode;
ctx->parser.Tokens = toks; _ctx->parser.Tokens = toks;
return parser_parse_variable(ctx); return parser_parse_variable();
} }
// Undef helper macros // Undef helper macros

View File

@ -17,7 +17,7 @@ StrBuilder tok_to_strbuilder(Token tok)
return result; return result;
} }
bool lex__eat(Context* ctx, TokArray* self, TokType type ); bool lex__eat( TokArray* self, TokType type );
Token* lex_current(TokArray* self, bool skip_formatting ) Token* lex_current(TokArray* self, bool skip_formatting )
{ {
@ -568,23 +568,6 @@ void lex_found_token( LexContext* ctx )
// TODO(Ed): We need to to attempt to recover from a lex failure? // TODO(Ed): We need to to attempt to recover from a lex failure?
neverinline
LexedInfo lex_WIP(Context* lib_ctx, Str content)
{
LexedInfo result = struct_zero();
result.text = content;
result.tokens = array_init_reserve(Token, ctx->Allocator_DyanmicContainers, ctx->InitSize_LexerTokens );
LexContext c = struct_zero(); LexContext* ctx = & c;
c.content = content;
c.left = content.Len;
c.scanner = content.Ptr;
return result;
}
neverinline neverinline
// void lex( Array<Token> tokens, Str content ) // void lex( Array<Token> tokens, Str content )
TokArray lex( Str content ) TokArray lex( Str content )

File diff suppressed because it is too large Load Diff

View File

@ -128,19 +128,10 @@ struct LexContext
Token token; Token token;
}; };
typedef struct LexerMessage LexerMessage;
struct LexerMessage
{
LexerMessage* next;
Str content;
LogLevel level;
};
struct LexedInfo struct LexedInfo
{ {
LexerMessage messages; Str text;
Str text; TokenSlice tokens;
TokenSlice tokens;
}; };
typedef struct ParseStackNode ParseStackNode; typedef struct ParseStackNode ParseStackNode;

View File

@ -31,38 +31,6 @@
*/ */
enum LogLevel //: u32
{
LL_Null,
LL_Note,
LL_Warning,
LL_Error,
LL_Fatal,
LL_UnderlyingType = GEN_U32_MAX,
};
typedef enum LogLevel LogLevel;
Str loglevel_to_str(LogLevel level)
{
local_persist
Str lookup[] = {
{ "Null", sizeof("Null") - 1 },
{ "Note", sizeof("Note") - 1 },
{ "Warning", sizeof("Info") - 1 },
{ "Error", sizeof("Error") - 1 },
{ "Fatal", sizeof("Fatal") - 1 },
};
return lookup[level];
}
struct LogEntry
{
Str msg;
LogLevel level;
};
typedef void LoggerProc(LogEntry entry);
enum AccessSpec : u32 enum AccessSpec : u32
{ {
AccessSpec_Default, AccessSpec_Default,

View File

@ -26,8 +26,10 @@ template <class TType> using TRemovePtr = typename RemovePtr<TType>::Type;
struct ArrayHeader; struct ArrayHeader;
template<class Type> struct Array; #if GEN_COMPILER_CPP
#define get_array_underlying_type(array) typename TRemovePtr<typeof(array)>:: DataType template<class Type> struct Array;
# define get_array_underlying_type(array) typename TRemovePtr<typeof(array)>:: DataType
#endif
usize array_grow_formula(ssize value); usize array_grow_formula(ssize value);
@ -57,12 +59,12 @@ struct ArrayHeader {
usize Num; usize Num;
}; };
#if GEN_COMPILER_CPP
template<class Type> template<class Type>
struct Array struct Array
{ {
Type* Data; Type* Data;
#if ! GEN_C_LIKE_CPP
#pragma region Member Mapping #pragma region Member Mapping
forceinline static Array init(AllocatorInfo allocator) { return array_init<Type>(allocator); } forceinline static Array init(AllocatorInfo allocator) { return array_init<Type>(allocator); }
forceinline static Array init_reserve(AllocatorInfo allocator, ssize capacity) { return array_init_reserve<Type>(allocator, capacity); } forceinline static Array init_reserve(AllocatorInfo allocator, ssize capacity) { return array_init_reserve<Type>(allocator, capacity); }
@ -86,7 +88,6 @@ struct Array
forceinline bool resize(usize num) { return array_resize<Type>(this, num); } forceinline bool resize(usize num) { return array_resize<Type>(this, num); }
forceinline bool set_capacity(usize new_capacity) { return array_set_capacity<Type>(this, new_capacity); } forceinline bool set_capacity(usize new_capacity) { return array_set_capacity<Type>(this, new_capacity); }
#pragma endregion Member Mapping #pragma endregion Member Mapping
#endif
forceinline operator Type*() { return Data; } forceinline operator Type*() { return Data; }
forceinline operator Type const*() const { return Data; } forceinline operator Type const*() const { return Data; }
@ -98,8 +99,9 @@ struct Array
using DataType = Type; using DataType = Type;
}; };
#endif
#if 0 #if GEN_COMPILER_CPP && 0
template<class Type> bool append(Array<Type>& array, Array<Type> other) { return append( & array, other ); } template<class Type> bool append(Array<Type>& array, Array<Type> other) { return append( & array, other ); }
template<class Type> bool append(Array<Type>& array, Type value) { return append( & array, value ); } template<class Type> bool append(Array<Type>& array, Type value) { return append( & array, value ); }
template<class Type> bool append(Array<Type>& array, Type* items, usize item_num) { return append( & array, items, item_num ); } template<class Type> bool append(Array<Type>& array, Type* items, usize item_num) { return append( & array, items, item_num ); }