mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-30 22:40:54 -07:00 
			
		
		
		
	Progress & proofing of docs
This commit is contained in:
		| @@ -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; | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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_<CodeName>` | ||||
| Each `struct Code<Name>` has an associated "filtered AST" with the naming convention: `AST_<CodeName>` | ||||
| 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 <name> | ||||
|  | ||||
| ``` | ||||
|  | ||||
| All optional parmeters are defined within `struct Opts_def_<functon name>`. 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_<funtion name>` 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 | ||||
|   | ||||
| @@ -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. | ||||
|   | ||||
| @@ -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 <interface_name>( 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 <interface_name>( 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; | ||||
|   | ||||
| @@ -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_ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user