diff --git a/base/components/ast.hpp b/base/components/ast.hpp index 007c52d..aaa9d8b 100644 --- a/base/components/ast.hpp +++ b/base/components/ast.hpp @@ -43,7 +43,7 @@ struct AST_Pragma; struct AST_PreprocessCond; struct AST_Specifiers; -#if GEN_EXECUTION_EXPRESSION_SUPPORT +#ifdef GEN_EXECUTION_EXPRESSION_SUPPORT struct AST_Expr; struct AST_Expr_Assign; struct AST_Expr_Alignof; @@ -140,7 +140,7 @@ struct CodePragma; struct CodeSpecifiers; #endif -#if GEN_EXECUTION_EXPRESSION_SUPPORT +#ifdef GEN_EXECUTION_EXPRESSION_SUPPORT #if GEN_COMPILER_C typedef AST_Expr* CodeExpr; diff --git a/base/components/ast_types.hpp b/base/components/ast_types.hpp index 5efd39a..1dc885b 100644 --- a/base/components/ast_types.hpp +++ b/base/components/ast_types.hpp @@ -247,7 +247,7 @@ struct AST_Exec }; static_assert( sizeof(AST_Exec) == sizeof(AST), "ERROR: AST_Exec is not the same size as AST"); -#if GEN_EXECUTION_EXPRESSION_SUPPORT +#ifdef GEN_EXECUTION_EXPRESSION_SUPPORT struct AST_Expr { union { @@ -750,7 +750,7 @@ struct AST_Specifiers }; static_assert( sizeof(AST_Specifiers) == sizeof(AST), "ERROR: AST_Specifier is not the same size as AST"); -#if GEN_EXECUTION_EXPRESSION_SUPPORT +#ifdef GEN_EXECUTION_EXPRESSION_SUPPORT struct AST_Stmt { union { diff --git a/base/components/code_types.hpp b/base/components/code_types.hpp index 26d5316..65c7254 100644 --- a/base/components/code_types.hpp +++ b/base/components/code_types.hpp @@ -362,7 +362,7 @@ struct CodeExec AST_Exec *ast; }; -#if GEN_EXECUTION_EXPRESSION_SUPPORT +#ifdef GEN_EXECUTION_EXPRESSION_SUPPORT struct CodeExpr { #if ! GEN_C_LIKE_CPP @@ -689,7 +689,7 @@ struct CodePreprocessCond AST_PreprocessCond* ast; }; -#if GEN_EXECUTION_EXPRESSION_SUPPORT +#ifdef GEN_EXECUTION_EXPRESSION_SUPPORT struct CodeStmt { #if ! GEN_C_LIKE_CPP diff --git a/docs/Readme.md b/docs/Readme.md index 22319f1..532b79e 100644 --- a/docs/Readme.md +++ b/docs/Readme.md @@ -26,7 +26,7 @@ This means that the typename entry for the parameter AST would be either: ***Concepts and Constraints are not supported*** Its a [todo](https://github.com/Ed94/gencpp/issues/21) -### Feature Macros: +### Feature Macros * `GEN_DEFINE_ATTRIBUTE_TOKENS` : Allows user to define their own attribute macros for use in parsing. * This can be generated using base.cpp. @@ -40,6 +40,18 @@ Its a [todo](https://github.com/Ed94/gencpp/issues/21) ### The Data & Interface +The library's persistent state is managed tracked by a context struct: `global Context* _ctx;` defined within [static_data.cpp](../base/components/static_data.cpp) + +https://github.com/Ed94/gencpp/blob/967a044637f1615c709cb723dc61118fcc08dcdb/base/components/interface.hpp#L39-L97 + +The interface for the context: + +* `init`: Initializtion +* `deinit`: De-initialization. +* `reset`: Clears the allocations, but doesn't free the memoery, then calls `init()` on `_ctx` again. +* `get_context`: Retreive the currently tracked context. +* `set_context`: Swap out the current tracked context. + As mentioned in root readme, the user is provided Code objects by calling the constructor's functions to generate them or find existing matches. The AST is managed by the library and provided to the user via its interface. @@ -47,12 +59,12 @@ However, the user may specifiy memory configuration. [Data layout of AST struct (Subject to heavily change with upcoming todos)](../base/components/ast.hpp#L396-461) -https://github.com/Ed94/gencpp/blob/eea4ebf5c40d5d87baa465abfb1be30845b2377e/base/components/ast.hpp#L396-L461 +https://github.com/Ed94/gencpp/blob/967a044637f1615c709cb723dc61118fcc08dcdb/base/components/ast.hpp#L369-L435 *`StringCahced` is a typedef for `Str` (a string slice), to denote it is an interned string* *`CodeType` is enum taggin the type of code. Has an underlying type of `u32`* *`OperatorT` is a typedef for `EOperator::Type` which has an underlying type of `u32`* -*`StrBuilder` is the dynamically allocated string type for the library* +*`StrBuilder` is the dynamically allocating string builder type for the library* AST widths are setup to be AST_POD_Size. The width dictates how much the static array can hold before it must give way to using an allocated array: @@ -117,6 +129,7 @@ The following CodeTypes are used which the user may optionally use strong typing * CodeClass * CodeConstructor * CodeDefine +* CodeDefineParams * CodeDestructor * CodeEnum * CodeExec @@ -127,7 +140,7 @@ The following CodeTypes are used which the user may optionally use strong typing * CodeModule * CodeNS * CodeOperator -* CodeOpCast +* CodeOpCast : User defined member operator conversion * CodeParams : Has support for `for : range` iterating across parameters. * CodePreprocessCond * CodePragma @@ -140,11 +153,15 @@ The following CodeTypes are used which the user may optionally use strong typing * CodeUsing * CodeVar -Each Code boy has an associated "filtered AST" with the naming convention: `AST_` +Each `struct Code` has an associated "filtered AST" with the naming convention: `AST_` Unrelated fields of the AST for that node type are omitted and only necessary padding members are defined otherwise. -Retrieving a raw version of the ast can be done using the `raw()` function defined in each AST. -## There are three sets of interfaces for Code AST generation the library provides +For the interface related to these code types see: + +* [ast.hpp](../base/components/ast.hpp): Under the region pragma `Code C-Interface` +* [code_types.hpp](../base/components/code_types.hpp): Under the region pragma `Code C-Interface`. Additional functionlity for c++ will be within the struct definitions or at the end of the file. + +## There are three categories of interfaces for Code AST generation & reflection * Upfront * Parsing @@ -164,6 +181,7 @@ Interface :`` * def_class * def_constructor * def_define +* def_define_params * def_destructor * def_enum * def_execution @@ -218,6 +236,27 @@ Code ``` +All optional parmeters are defined within `struct Opts_def_`. This was done to setup a [macro trick](https://x.com/vkrajacic/status/1749816169736073295) for default optional parameers in the C library: + +```cpp +struct gen_Opts_def_struct +{ + gen_CodeBody body; + gen_CodeTypename parent; + gen_AccessSpec parent_access; + gen_CodeAttributes attributes; + gen_CodeTypename* interfaces; + gen_s32 num_interfaces; + gen_ModuleFlag mflags; +}; +typedef struct gen_Opts_def_struct gen_Opts_def_struct; + +GEN_API gen_CodeClass gen_def__struct( gen_Str name, gen_Opts_def_struct opts GEN_PARAM_DEFAULT ); +#define gen_def_struct( name, ... ) gen_def__struct( name, ( gen_Opts_def_struct ) { __VA_ARGS__ } ) +``` + +In the C++ library, the `def_` is not wrapped in a macro. + When using the body functions, its recommended to use the args macro to auto determine the number of arguments for the varadic: ```cpp @@ -228,7 +267,7 @@ def_global_body( 3, ht_entry, array_ht_entry, hashtable ); ``` If a more incremental approach is desired for the body ASTs, `Code def_body( CodeT type )` can be used to create an empty body. -When the members have been populated use: `AST::validate_body` to verify that the members are valid entires for that type. +When the members have been populated use: `code_validate_body` to verify that the members are valid entires for that type. ### Parse construction @@ -244,7 +283,6 @@ Interface : * parse_export_body * parse_extern_link * parse_friend - * Purposefully are only support forward declares with this constructor. * parse_function * parse_global_body * parse_namespace diff --git a/gen_c_library/Readme.md b/gen_c_library/Readme.md index 53992a8..9d74c45 100644 --- a/gen_c_library/Readme.md +++ b/gen_c_library/Readme.md @@ -91,7 +91,7 @@ C_Expression _Generic( selector_arg, a_type_expr_pair, ... ) { The first `arg` of _Generic behaves as the "controlling expression" or the expression that resolves to a type which will dictate which of the following expressions provided after to `_Generic` will be resolved as the one used inline for the implemenation. -For this library's purposes we'll be using the functional macro equivalent *(if there is an excpetion I'll link it at the end fo the section)*: +For this library's purposes we'll be using the functional macro equivalent *(if there is an exception I'll link it at the end of this section)*: ```c #define macro_that_uses_selector_arg_for_resolving_a_fucntion( selecting_exp) \ @@ -142,4 +142,4 @@ So for any given templated container interface. Expect the follwoing (taken stra `GEN_RESOLVED_FUNCTION_CALL` is an empty define, its just to indicate that its intended to expand to a function call. -To see the thea actual macro definitions used: [generic_macros.h](./components/generic_macros.h) has them. They'll be injected right after the usual macros are positioned in the header file. +To see the the actual macro definitions used - see: [generic_macros.h](./components/generic_macros.h). They'll be injected right after the usual macros in the generated header file. diff --git a/gen_c_library/c_library.cpp b/gen_c_library/c_library.cpp index 1e060c8..679c680 100644 --- a/gen_c_library/c_library.cpp +++ b/gen_c_library/c_library.cpp @@ -800,6 +800,9 @@ do \ b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_ast, ast ); if (found) break; + found = ignore_preprocess_cond_block(txt("GEN_EXECUTION_EXPRESSION_SUPPORT"), entry, parsed_ast, ast ); + if (found) break; + ast.append(entry); } break; @@ -978,6 +981,9 @@ R"(#define AST_ArrSpecs_Cap \ found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_code_types, code_types ); if (found) break; + found = ignore_preprocess_cond_block(txt("GEN_EXECUTION_EXPRESSION_SUPPORT"), entry, parsed_code_types, code_types); + if (found) break; + code_types.append(entry); } break; @@ -1072,7 +1078,10 @@ R"(#define ( code ) _Generic( (code), \ case CT_Preprocess_If: case CT_Preprocess_IfDef: { - b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_code_types, code_types ); + b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_ast_types, ast_types ); + if (found) break; + + found = ignore_preprocess_cond_block(txt("GEN_EXECUTION_EXPRESSION_SUPPORT"), entry, parsed_ast_types, ast_types); if (found) break; ast_types.append(entry); @@ -1128,6 +1137,9 @@ R"(#define ( code ) _Generic( (code), \ found = ignore_preprocess_cond_block(txt("GEN_COMPILER_CPP"), entry, parsed_interface, interface); if (found) break; + found = ignore_preprocess_cond_block(txt("0"), entry, parsed_interface, interface); + if (found) break; + interface.append(entry); } break; diff --git a/gen_c_library/c_library.refactor b/gen_c_library/c_library.refactor index a6a9262..20f3073 100644 --- a/gen_c_library/c_library.refactor +++ b/gen_c_library/c_library.refactor @@ -420,6 +420,8 @@ word make_code, gen_make_code namespace set_allocator_, gen_set_allocator_ +namespace Opts_, gen_Opts_ + namespace def_, gen_def_ namespace parse_, gen_parse_ namespace token_, gen_token_