Preparing for reductions on code_types.hpp

This commit is contained in:
Edward R. Gonzalez 2024-12-02 01:56:49 -05:00
parent c38b077c37
commit 2dcc968c39
3 changed files with 319 additions and 166 deletions

View File

@ -73,73 +73,84 @@ struct AST_Union;
struct AST_Using;
struct AST_Var;
struct Code;
struct CodeBody;
// These are to offer ease of use and optionally strong type safety for the AST.
struct CodeAttributes;
// struct CodeBaseClass;
struct CodeComment;
struct CodeClass;
struct CodeConstructor;
struct CodeDefine;
struct CodeDestructor;
struct CodeEnum;
struct CodeExec;
struct CodeExtern;
struct CodeInclude;
struct CodeFriend;
struct CodeFn;
struct CodeModule;
struct CodeNS;
struct CodeOperator;
struct CodeOpCast;
struct CodeParam;
struct CodePreprocessCond;
struct CodePragma;
struct CodeSpecifiers;
#if GEN_EXECUTION_EXPRESSION_SUPPORT
struct CodeExpr;
struct CodeExpr_Assign;
struct CodeExpr_Alignof;
struct CodeExpr_Binary;
struct CodeExpr_CStyleCast;
struct CodeExpr_FunctionalCast;
struct CodeExpr_CppCast;
struct CodeExpr_Element;
struct CodeExpr_ProcCall;
struct CodeExpr_Decltype;
struct CodeExpr_Comma;
struct CodeExpr_AMS; // Access Member Symbol
struct CodeExpr_Sizeof;
struct CodeExpr_Subscript;
struct CodeExpr_Ternary;
struct CodeExpr_UnaryPrefix;
struct CodeExpr_UnaryPostfix;
struct CodeStmt;
struct CodeStmt_Break;
struct CodeStmt_Case;
struct CodeStmt_Continue;
struct CodeStmt_Decl;
struct CodeStmt_Do;
struct CodeStmt_Expr;
struct CodeStmt_Else;
struct CodeStmt_If;
struct CodeStmt_For;
struct CodeStmt_Goto;
struct CodeStmt_Label;
struct CodeStmt_Switch;
struct CodeStmt_While;
#if GEN_COMPILER_C
#define Define_Code(Type) typedef AST_##Type* Code##Type
#else
#define Define_Code(Type) struct Code##Type
#endif
struct CodeStruct;
struct CodeTemplate;
struct CodeType;
struct CodeTypedef;
struct CodeUnion;
struct CodeUsing;
struct CodeVar;
#if GEN_COMPILER_C
typedef AST* code;
#else
struct Code;
#endif
Define_Code(Body);
// These are to offer ease of use and optionally strong type safety for the AST.
Define_Code(Attributes);
// struct CodeBaseClass;
Define_Code(Comment);
Define_Code(Class);
Define_Code(Constructor);
Define_Code(Define);
Define_Code(Destructor);
Define_Code(Enum);
Define_Code(Exec);
Define_Code(Extern);
Define_Code(Include);
Define_Code(Friend);
Define_Code(Fn);
Define_Code(Module);
Define_Code(NS);
Define_Code(Operator);
Define_Code(OpCast);
Define_Code(Param);
Define_Code(PreprocessCond);
Define_Code(Pragma);
Define_Code(Specifiers);
#if GEN_EXECUTION_EXPRESSION_SUPPORT
Define_Code(Expr);
Define_Code(Expr_Assign);
Define_Code(Expr_Alignof);
Define_Code(Expr_Binary);
Define_Code(Expr_CStyleCast);
Define_Code(Expr_FunctionalCast);
Define_Code(Expr_CppCast);
Define_Code(Expr_Element);
Define_Code(Expr_ProcCall);
Define_Code(Expr_Decltype);
Define_Code(Expr_Comma);
Define_Code(Expr_AMS); // Access Member Symbol
Define_Code(Expr_Sizeof);
Define_Code(Expr_Subscript);
Define_Code(Expr_Ternary);
Define_Code(Expr_UnaryPrefix);
Define_Code(Expr_UnaryPostfix);
Define_Code(Stmt);
Define_Code(Stmt_Break);
Define_Code(Stmt_Case);
Define_Code(Stmt_Continue);
Define_Code(Stmt_Decl);
Define_Code(Stmt_Do);
Define_Code(Stmt_Expr);
Define_Code(Stmt_Else);
Define_Code(Stmt_If);
Define_Code(Stmt_For);
Define_Code(Stmt_Goto);
Define_Code(Stmt_Label);
Define_Code(Stmt_Switch);
Define_Code(Stmt_While);
#endif
Define_Code(Struct);
Define_Code(Template);
Define_Code(Type);
Define_Code(Typedef);
Define_Code(Union);
Define_Code(Using);
Define_Code(Var);
#undef Define_Code
namespace parser
{
@ -159,6 +170,7 @@ bool is_valid (Code code);
void set_global(Code code);
String to_string (Code code);
#if ! GEN_COMPILER_C
/*
AST* wrapper
- Not constantly have to append the '*' as this is written often..
@ -168,32 +180,32 @@ struct Code
{
AST* ast;
# define Using_Code( Typename ) \
char const* debug_str() { return GEN_NS debug_str(* this); } \
Code duplicate() { return GEN_NS duplicate(* this); } \
# define Using_Code( Typename ) \
char const* debug_str() { return GEN_NS debug_str(* this); } \
Code duplicate() { return GEN_NS duplicate(* this); } \
bool is_equal( Code other ) { return GEN_NS is_equal(* this, other); } \
bool is_body() { return GEN_NS is_body(* this); } \
bool is_valid() { return GEN_NS is_valid(* this); } \
void set_global() { return GEN_NS set_global(* this); } \
String to_string(); \
Typename& operator = ( AST* other ); \
Typename& operator = ( Code other ); \
bool is_body() { return GEN_NS is_body(* this); } \
bool is_valid() { return GEN_NS is_valid(* this); } \
void set_global() { return GEN_NS set_global(* this); }
# define Using_CodeOps( Typename ) \
Typename& operator = ( AST* other ); \
Typename& operator = ( Code other ); \
bool operator ==( Code other ) { return (AST*)ast == other.ast; } \
bool operator !=( Code other ) { return (AST*)ast != other.ast; } \
operator bool();
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( Code );
String to_string() { return GEN_NS to_string(* this); }
#endif
Using_CodeOps( Code );
template< class Type >
forceinline Type code_cast()
{
return * rcast( Type*, this );
}
forceinline Type code_cast() { return * rcast( Type*, this ); }
AST* operator ->()
{
return ast;
}
AST* operator ->() { return ast; }
Code& operator ++();
// TODO(Ed) : Remove this overload.
@ -242,6 +254,7 @@ struct Code
operator CodeVar() const;
#undef operator
};
#endif
#pragma region Statics
// Used to identify ASTs that should always be duplicated. (Global constant ASTs)

View File

@ -3,14 +3,14 @@
#include "ast.cpp"
#endif
String Code::to_string()
String to_string(Code self)
{
if ( ast == nullptr )
if ( self.ast == nullptr )
{
log_failure( "Code::to_string: Cannot convert code to string, AST is null!" );
return { nullptr };
}
return rcast( AST*, ast )->to_string();
return rcast( AST*, self.ast )->to_string();
}
String CodeAttributes::to_string()

View File

@ -4,9 +4,13 @@
#endif
#pragma region Code Types
// These structs are not used at all by the C vairant.
#if ! GEN_COMPILER_C
// stati_assert( GEN_COMPILER_C, "This should not be compiled with the C-library" );
struct CodeBody
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeBody );
void append( Code other )
@ -28,19 +32,20 @@ struct CodeBody
bool has_entries() { return GEN_NS has_entries(rcast( AST*, ast )); }
AST* raw() { return rcast( AST*, ast ); }
void to_string( String& result );
void to_string_export( String& result );
AST_Body* operator->() { return ast; }
String to_string();
void to_string( String& result );
void to_string_export( String& result );
#endif
Using_CodeOps( CodeBody );
operator Code() { return * rcast( Code*, this ); }
AST_Body* operator->() { return ast; }
#pragma region Iterator
Code begin()
{
if ( ast )
return { rcast( AST*, ast)->Front };
return { nullptr };
}
Code end()
@ -54,21 +59,20 @@ struct CodeBody
struct CodeClass
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeClass );
void add_interface( CodeType interface );
void to_string_def( String& result );
void to_string_fwd( String& result );
String to_string();
void to_string_def( String& result );
void to_string_fwd( String& result );
AST* raw()
{
return rcast( AST*, ast );
}
operator Code()
{
return * rcast( Code*, this );
}
AST* raw() { return rcast( AST*, ast ); }
#endif
Using_CodeOps( CodeClass );
operator Code() { return * rcast( Code*, this ); }
AST_Class* operator->()
{
if ( ast == nullptr )
@ -83,13 +87,17 @@ struct CodeClass
struct CodeParam
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeParam );
void append( CodeParam other );
void append( CodeParam other );
CodeParam get( s32 idx );
bool has_entries();
void to_string( String& result );
bool has_entries();
String to_string();
void to_string( String& result );
#endif
Using_CodeOps( CodeParam );
AST* raw()
{
return rcast( AST*, ast );
@ -132,6 +140,7 @@ struct CodeParam
struct CodeSpecifiers
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeSpecifiers );
bool append( SpecifierT spec )
@ -202,7 +211,11 @@ struct CodeSpecifiers
}
return result;
}
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeSpecifiers);
AST* raw()
{
return rcast( AST*, ast );
@ -239,13 +252,17 @@ struct CodeSpecifiers
struct CodeStruct
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeStruct );
void add_interface( CodeType interface );
void to_string_def( String& result );
void to_string_fwd( String& result );
String to_string();
void to_string_fwd( String& result );
void to_string_def( String& result );
#endif
Using_CodeOps( CodeStruct );
AST* raw()
{
return rcast( AST*, ast );
@ -266,27 +283,47 @@ struct CodeStruct
AST_Struct* ast;
};
#define Define_CodeType( Typename ) \
struct Code##Typename \
{ \
Using_Code( Code ## Typename ); \
AST* raw(); \
operator Code(); \
AST_##Typename* operator->(); \
AST_##Typename* ast; \
}
struct CodeAttributes
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code(CodeAttributes);
String to_string();
#endif
Using_CodeOps(CodeAttributes);
AST *raw();
operator Code();
AST_Attributes *operator->();
AST_Attributes *ast;
};
Define_CodeType( Attributes );
// Define_CodeType( BaseClass );
Define_CodeType( Comment );
struct CodeComment
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code(CodeComment);
String to_string();
#endif
Using_CodeOps(CodeComment);
AST *raw();
operator Code();
AST_Comment *operator->();
AST_Comment *ast;
};
struct CodeConstructor
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeConstructor );
void to_string_def( String& result );
void to_string_fwd( String& result );
String to_string();
void to_string_def( String& result );
void to_string_fwd( String& result );
#endif
Using_CodeOps(CodeConstructor);
AST* raw();
operator Code();
AST_Constructor* operator->();
@ -295,10 +332,14 @@ struct CodeConstructor
struct CodeDefine
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeDefine );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeDefine);
AST* raw();
operator Code();
AST_Define* operator->();
@ -307,11 +348,15 @@ struct CodeDefine
struct CodeDestructor
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeDestructor );
void to_string_def( String& result );
void to_string_fwd( String& result );
String to_string();
void to_string_def( String& result );
void to_string_fwd( String& result );
#endif
Using_CodeOps(CodeDestructor);
AST* raw();
operator Code();
AST_Destructor* operator->();
@ -320,20 +365,36 @@ struct CodeDestructor
struct CodeEnum
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeEnum );
void to_string_def( String& result );
void to_string_fwd( String& result );
void to_string_class_def( String& result );
void to_string_class_fwd( String& result );
String to_string();
void to_string_def( String& result );
void to_string_fwd( String& result );
void to_string_class_def( String& result );
void to_string_class_fwd( String& result );
#endif
Using_CodeOps(CodeEnum);
AST* raw();
operator Code();
AST_Enum* operator->();
AST_Enum* ast;
};
Define_CodeType( Exec );
struct CodeExec
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code(CodeExec);
String to_string();
#endif
Using_CodeOps(CodeExec);
AST *raw();
operator Code();
AST_Exec *operator->();
AST_Exec *ast;
};
#if GEN_EXECUTION_EXPRESSION_SUPPORT
struct CodeExpr
@ -543,10 +604,13 @@ struct CodeExpr_UnaryPostfix
struct CodeExtern
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeExtern );
void to_string( String& result );
#endif
Using_CodeOps(CodeExtern);
AST* raw();
operator Code();
AST_Extern* operator->();
@ -555,10 +619,14 @@ struct CodeExtern
struct CodeInclude
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeInclude );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeInclude);
AST* raw();
operator Code();
AST_Include* operator->();
@ -567,10 +635,14 @@ struct CodeInclude
struct CodeFriend
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeFriend );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeFriend);
AST* raw();
operator Code();
AST_Friend* operator->();
@ -579,11 +651,15 @@ struct CodeFriend
struct CodeFn
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeFn );
void to_string_def( String& result );
void to_string_fwd( String& result );
String to_string();
void to_string_def( String& result );
void to_string_fwd( String& result );
#endif
Using_CodeOps(CodeFn);
AST* raw();
operator Code();
AST_Fn* operator->();
@ -592,10 +668,14 @@ struct CodeFn
struct CodeModule
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeModule );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeModule);
AST* raw();
operator Code();
AST_Module* operator->();
@ -604,10 +684,14 @@ struct CodeModule
struct CodeNS
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeNS );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeNS);
AST* raw();
operator Code();
AST_NS* operator->();
@ -616,11 +700,15 @@ struct CodeNS
struct CodeOperator
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeOperator );
void to_string_def( String& result );
void to_string_fwd( String& result );
String to_string();
void to_string_def( String& result );
void to_string_fwd( String& result );
#endif
Using_CodeOps(CodeOperator);
AST* raw();
operator Code();
AST_Operator* operator->();
@ -629,11 +717,15 @@ struct CodeOperator
struct CodeOpCast
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeOpCast );
void to_string_def( String& result );
void to_string_fwd( String& result );
String to_string();
void to_string_def( String& result );
void to_string_fwd( String& result );
#endif
Using_CodeOps(CodeOpCast);
AST* raw();
operator Code();
AST_OpCast* operator->();
@ -642,10 +734,14 @@ struct CodeOpCast
struct CodePragma
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodePragma );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps( CodePragma );
AST* raw();
operator Code();
AST_Pragma* operator->();
@ -654,15 +750,19 @@ struct CodePragma
struct CodePreprocessCond
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodePreprocessCond );
void to_string_if( String& result );
void to_string_ifdef( String& result );
void to_string_ifndef( String& result );
void to_string_elif( String& result );
void to_string_else( String& result );
void to_string_endif( String& result );
String to_string();
void to_string_if( String& result );
void to_string_ifdef( String& result );
void to_string_ifndef( String& result );
void to_string_elif( String& result );
void to_string_else( String& result );
void to_string_endif( String& result );
#endif
Using_CodeOps( CodePreprocessCond );
AST* raw();
operator Code();
AST_PreprocessCond* operator->();
@ -674,7 +774,8 @@ struct CodeStmt
{
Using_Code( CodeStmt );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -686,7 +787,8 @@ struct CodeStmt_Break
{
Using_Code( CodeStmt_Break );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -698,7 +800,8 @@ struct CodeStmt_Case
{
Using_Code( CodeStmt_Case );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -710,7 +813,8 @@ struct CodeStmt_Continue
{
Using_Code( CodeStmt_Continue );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -722,7 +826,8 @@ struct CodeStmt_Decl
{
Using_Code( CodeStmt_Decl );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -734,7 +839,8 @@ struct CodeStmt_Do
{
Using_Code( CodeStmt_Do );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -746,7 +852,8 @@ struct CodeStmt_Expr
{
Using_Code( CodeStmt_Expr );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -758,7 +865,8 @@ struct CodeStmt_Else
{
Using_Code( CodeStmt_Else );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -770,7 +878,8 @@ struct CodeStmt_If
{
Using_Code( CodeStmt_If );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -782,7 +891,8 @@ struct CodeStmt_For
{
Using_Code( CodeStmt_For );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -794,7 +904,8 @@ struct CodeStmt_Goto
{
Using_Code( CodeStmt_Goto );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -806,7 +917,8 @@ struct CodeStmt_Label
{
Using_Code( CodeStmt_Label );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -818,7 +930,8 @@ struct CodeStmt_Switch
{
Using_Code( CodeStmt_Switch );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -830,7 +943,8 @@ struct CodeStmt_While
{
Using_Code( CodeStmt_While );
void to_string( String& result );
String to_string();
void to_string( String& result );
AST* raw();
operator Code();
@ -841,10 +955,14 @@ struct CodeStmt_While
struct CodeTemplate
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeTemplate );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps( CodeTemplate );
AST* raw();
operator Code();
AST_Template* operator->();
@ -853,10 +971,14 @@ struct CodeTemplate
struct CodeType
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeType );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps( CodeType );
AST* raw();
operator Code();
AST_Type* operator->();
@ -865,10 +987,14 @@ struct CodeType
struct CodeTypedef
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeTypedef );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps( CodeTypedef );
AST* raw();
operator Code();
AST_Typedef* operator->();
@ -877,10 +1003,14 @@ struct CodeTypedef
struct CodeUnion
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeUnion );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeUnion);
AST* raw();
operator Code();
AST_Union* operator->();
@ -889,11 +1019,15 @@ struct CodeUnion
struct CodeUsing
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeUsing );
void to_string( String& result );
void to_string_ns( String& result );
String to_string();
void to_string( String& result );
void to_string_ns( String& result );
#endif
Using_CodeOps(CodeUsing);
AST* raw();
operator Code();
AST_Using* operator->();
@ -902,10 +1036,14 @@ struct CodeUsing
struct CodeVar
{
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
Using_Code( CodeVar );
void to_string( String& result );
String to_string();
void to_string( String& result );
#endif
Using_CodeOps(CodeVar);
AST* raw();
operator Code();
AST_Var* operator->();
@ -914,5 +1052,7 @@ struct CodeVar
#undef Define_CodeType
#undef Using_Code
#undef Using_CodeOps
#endif //if ! GEN_COMPILER_C
#pragma endregion Code Types