- CodeParam -> CodeParams - interfaces array weren't being used in parse_class_struct - added enum_underlying_sig
13 KiB
Navigation
AST Types Documentation
While the Readme for docs covers the data layout per AST, this will focus on the AST types avaialble, and their nuances.
Body
These are containers representing a scope body of a definition that can be of the following CodeType
type:
- Class_Body
- Enum_Body
- Export_Body
- Extern_Linkage_Body
- Function_Body
- Global_Body
- Namespace_Body
- Struct_Body
- Union_Body
Fields:
StringCached Name;
Code Front;
Code Back;
Token* Tok;
Code Parent;
CodeT Type;
s32 NumEntries;
The Front
member represents the start of the link list and Back
the end.
NumEntries is the number of entries in the body.
Parent should have a compatible CodeType type for the type of defintion used.
Serialization:
Will output only the entries, the braces are handled by the parent.
<Front>
...
<Back>
Attributes
Represent standard or vendor specific C/C++ attributes.
Fields:
StringCached Content;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
<Content>
While the parser supports the __declspec
and __attribute__
syntax, the upfront constructor ( def_attributes ) must have the user specify the entire attribute, including the [[]]
, __declspec
or __attribute__
parts.
Comment
Stores a comment.
Fields:
StringCached Content;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
<Content>
The parser will perserve comments found if residing with a body or in accepted inline-to-definition locations. Otherwise they will be skipped by the TokArray::__eat and TokArray::current( skip foramtting enabled ) functions.
The upfront constructor: def_comment
expects to recieve a comment without the //
or /* */
parts. It will add them during construction.
Class & Struct
Fields:
CodeComment InlineCmt; // Only supported by forward declarations
CodeAttributes Attributes;
CodeType ParentType;
CodeBody Body;
StringCached Name;
CodeType Prev;
CodeType Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
AccessSpec ParentAccess;
Serialization:
// Class_Fwd
<ModuleFlags> <class/struct> <Name>; <InlineCmt>
// Class
<ModuleFlags> <class/struct> <Attributes> <Name> : <ParentAccess> <ParentType>, public <ParentType->Next>, ... <InlineCmt>
{
<Body>
};
You'll notice that only one parent type is supported only with parent access. This library only supports single inheritance, the rest are assumed to be interfaces and are given public acess specifiers.
Constructor
Fields:
CodeComment InlineCmt; // Only supported by forward declarations
Code InitializerList;
CodeParams Params;
Code Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
// Constructor_Fwd
<Specs> <Parent->Name>( <Params> ); <InlineCmt>
// Constructor
<Specs> <Parent->Name>( <Params> ) <InlineCmt>
: <InitializerList>
{
<Body>
}
// Constructor Source Implementation
<Specs> <Parent>::~<Parent->Name>( <Params> ) <Specs>
{
<Body>
}
Define
Represents a preprocessor define
Fields:
StringCached Content;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
#define <Name> <Content>
Destructor
Fields:
CodeComment InlineCmt;
CodeSpecifiers Specs;
Code Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
// Destructor_Fwd
<Specs> ~<Parent->Name>( <Params> ) <Specs>; <InlineCmt>
// Destructor
<Specs> ~<Parent->Name>( <Params> ) <Specs>
{
<Body>
}
// Destructor Source Implementation
<Specs> <Parent>::~<Parent->Name>( <Params> ) <Specs>
{
<Body>
}
Enum
Fields:
CodeComment InlineCmt;
CodeAttributes Attributes;
CodeType UnderlyingType;
Code UnderlyingTypeMacro;
CodeBody Body;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
StringCached Name;
CodeT Type;
ModuleFlag ModuleFlags;
UnderlyingTypeMacro is a macro the library natively supports: enum_underlying(type)
that is meant to behave as a wrapper for underlying type assignment.
The enum_underlying_sig
is a StrC
global var that can be set which will be defined within PreprocessorDefines
and used in parser_parse_enum
to identify a valid macro.
Serialization:
// Enum_Fwd
<ModuleFlags> enum class <Name> : <UnderlyingType> or <UnderlyingTypeMacro> ; <InlineCmt>
// Enum
<ModuleFlags> <enum or enum class> <Name> : <UnderlyingType> or <UnderlyingTypeMacro>
{
<Body>
};
Execution
Just represents an execution body. Equivalent to an untyped body. Will be obsolute when function body parsing is implemented.
Fields:
StringCached Content;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
<Content>
External Linkage
Fields:
CodeBody Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
extern "<Name>"
{
<Body>
}
Include
Fields:
StringCached Content;
StringCached Name;
Code Prev;
Code Next;
Code Parent;
Token* Tok;
CodeT Type;
Serialization:
#include <Content>
Friend
This library (until its necessary become some third-party library to do otherwise) does not support friend declarations with in-statment function definitions.
Fields:
CodeComment InlineCmt;
Code Declaration;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
friend <Declaration>; <InlineCmt>
Function
Fields:
CodeComment InlineCmt;
CodeAttributes Attributes;
CodeSpecifiers Specs;
CodeType ReturnType;
CodeParams Params;
CodeBody Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
Serialization:
// Function_Fwd
<ModuleFlags> <Attributes> <Specs> <ReturnType> <Name>( <Params> ) <Specs>; <InlineCmt>
// Function
<ModuleFlags> <Attributes> <Specs> <ReturnType> <Name>( <Params> ) <Specs>
{
<Body>
}
Module
Fields:
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
Serialization:
<ModuleFlags> module <Name>;
Namespace
Fields:
CodeBody Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
Serialization:
<ModuleFlags> namespace <Name>
{
<Body>
}
Operator Overload (Operator)
Fields:
CodeComment InlineCmt;
CodeAttributes Attributes;
CodeSpecifiers Specs;
CodeType ReturnType;
CodeParams Params;
CodeBody Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
OperatorT Op;
Serialization:
// Operator_Fwd
<ModuleFlags> <Attributes> <Specs> <ReturnType> operator <Op>( <Params> ) <Specs>; <InlineCmt>
// Operator
<ModuleFlags> <Attributes> <Specs> <ReturnType> <Name>operator <Op>( <Params> ) <Specs>
{
<Body>
}
Operator Cast Overload ( User-Defined Type Conversion, OpCast )
Fields:
CodeComment InlineCmt;
CodeSpecifiers Specs;
CodeType ValueType;
CodeBody Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
// Operator_Cast_Fwd
<Specs> operator <ValueType>() <Specs>; <InlineCmt>
// Operator_Cast
<Specs> <Name>operator <ValueType>() <Specs>
{
<Body>
}
Parameters (AST_Params)
Fields:
CodeType ValueType;
Code Macro;
Code Value;
Code PostNameMacro;
StringCached Name;
CodeParams Last;
CodeParams Next;
Token* Tok;
Code Parent;
CodeT Type;
s32 NumEntries;
Serialization:
<Macro>, <Next> ... <Last>
<Macro> <ValueType> <Name> <PostNameMacro> = <Value>, <Next>... <Last>
Pragma
Fields:
StringCached Content;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
#pragma <Content>
Preprocessor Conditional
Fields:
StringCached Content;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
Serialization:
#<based off Type> <Content>
Specifiers
Fields:
SpecifierT ArrSpecs[ AST_ArrSpecs_Cap ];
CodeSpecifiers NextSpecs;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
s32 NumEntries;
Serialization:
<Spec>, ...
Template
Fields:
CodeParams Params;
Code Declaration;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
Serialization:
<ModuleFlags>
template< <Params> >
<Declaration>
Typename
Typenames represent the type "symbol".
Fields:
CodeAttributes Attributes;
CodeSpecifiers Specs;
CodeReturnType ReturnType;
CodeParams Params;
Code ArrExpr;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
StringCached Name;
CodeT Type;
b32 IsParamPack;
ETypenameTag TypeTag;
Serialization:
<Attributes> <TypeTag> <Name> <Specs> <IsParamPack ?: ...>
// Function
<Attributes> <ReturnType> <Name> <Params> <Specs>
<Name>
currently has the full serialization of anything with
Note: ArrExpr is not used in serialization by typename_to_string_ref
its instead handled by a parent AST's serailization (variable, typedef, using).
Typedef
Behave as usual except function or macro typedefs.
Those (macros) don't use the underlying type field as everything was serialized under the Name field.
Fields:
CodeComment InlineCmt;
Code UnderlyingType;
StringCached Name;
Code Prev;
Code Next;
Token* Tok
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
b32 IsFunction;
Serialization:
// Regular
<ModuleFlags> typedef <UnderlyingType> <Name> <UnderlyingType-ArrExpr>; <InlineCmt>
// Functions
// Currently:
<ModuleFlags> typedef <UnderlyingType (Serialized expression)>; <InlineCmt>
// Desired: Not handled yet
<ModuleFlags> typedef <UnderlyingType->ReturnType> UnderlyingType->Name> <UnderlyingType-ArrExpr> ( <UnderlyingType->Parameters> ); <InlineCmt>
<ModuleFlags> typedef <UnderlyingType->ReturnType> ( <Name->Namespace> for<Specs->has(Spec_Ptr) ?: *> <UnderlyingType->Name> <UnderlyingType-ArrExpr> ) ( <UnderlyingType->Parameters> ); <InlineCmt>
Union
Fields:
CodeAttributes Attributes;
CodeBody Body;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
Serialization:
<ModuleFlags> union <Attributes> <Name>
{
<Body>
}
Using
Fields:
CodeComment InlineCmt;
CodeAttributes Attributes;
CodeType UnderlyingType;
StringCached Name;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
Serialization:
// Regular
<ModuleFlags> using <Attributes> <Name> = <UnderlyingType>; <InlineCmt>
// Namespace
<ModuleFlags> using namespace <Name>; <InlineCmt>
Variable
Algo
Fields:
CodeComment InlineCmt;
CodeAttributes Attributes;
CodeSpecifiers Specs;
CodeType ValueType;
Code BitfieldSize;
Code Value;
StringCached Name;
CodeVar NextVar;
Code Prev;
Code Next;
Token* Tok;
Code Parent;
CodeT Type;
ModuleFlag ModuleFlags;
s32 VarParenthesizedInit;
Serialization:
// Regular
<ModuleFlags> <Attributes> <Specs> <ValueType> <Name> = <Value>, NextVar ...; <InlineCmt>
// Bitfield
<ModuleFlags> <Attributes> <Specs> <ValueType> <Name> : <BitfieldSize> = <Value>, NextVar ...; <InlineCmt>
// VarParenthesizedInit
<Attributes> <Specs> <ValueType> <Name>( <Value>, NextVar ... ); <InlineCmt>