"L. Spiro Engine"
|
00001 00017 #ifndef __LSG_SHADERLANGUAGEPARSER_H__ 00018 #define __LSG_SHADERLANGUAGEPARSER_H__ 00019 00020 #include "../LSGGraphicsLib.h" 00021 #include "Algorithm/LSTLAlgorithm.h" 00022 #include "LSGShaderScopeStack.h" 00023 #include "LSGShaderSyntaxNodes.h" 00024 #include "String/LSTLString.h" 00025 #include "Vector/LSTLVector.h" 00026 00027 namespace lsg { 00028 00029 class CShaderLexer; 00030 00038 class CShaderLanguageParser { 00039 public : 00040 // == Enumerations. 00044 enum LSG_SHADER_TYPES { 00045 LSG_ST_INVALID = -1, 00046 LSG_ST_VERTEX, 00047 LSG_ST_PIXEL, 00048 00049 LSG_ST_TOTAL, // Shader types must be from 0 to X, as the enumerated values are 00050 // used as indices in some places. 00051 }; 00052 00056 enum LSG_STRUCT_BASE { 00057 LSG_SB_START = 10000 00058 }; 00059 00060 00061 // == Various constructors. 00062 LSE_CALLCTOR CShaderLanguageParser( LSG_SHADER_TYPES _stType, CShaderLexer * _plLexer ); 00063 00064 00065 // == Types. 00069 typedef struct LSG_IDENTIFIER { 00070 // == Enumerations. 00071 enum LSG_IDENTIFIER_TYPE { 00072 LSG_IT_UNDEFINED, 00073 LSG_IT_INTEGRAL, 00074 LSG_IT_FLOATING, 00075 LSG_IT_VECTOR, 00076 LSG_IT_MATRIX, 00077 LSG_IT_STRING, 00078 }; 00079 00080 00081 // == Members. 00085 LSUINT32 ui32Name; 00086 00090 LSUINT8 ui8Type; 00091 } * LPLSG_IDENTIFIER, * const LPCLSG_IDENTIFIER; 00092 00096 typedef union LSG_SCALAR { 00100 LSUINT64 ui64Value; 00101 00105 LSINT64 i64Value; 00106 00110 LSDOUBLE dValue; 00111 } * LPLSG_SCALAR, * const LPCLSG_SCALAR; 00112 00116 typedef struct LSG_STRUCT_MEMBER { 00120 CString sName; 00121 00125 LSUINT64 ui64Type; 00126 00130 LSUINT32 ui32Array; 00131 00132 00133 // == Operators. 00140 LSG_STRUCT_MEMBER & LSE_CALL operator = ( const LSG_STRUCT_MEMBER &_smSource ); 00141 } * LPLSG_STRUCT_MEMBER, * const LPCLSG_STRUCT_MEMBER; 00142 00146 typedef struct LSG_STRUCT { 00150 CString sName; 00151 00155 CVector<LSG_STRUCT_MEMBER> vMembers; 00156 00157 00158 // == Operators. 00165 LSG_STRUCT & LSE_CALL operator = ( const LSG_STRUCT &_sSource ); 00166 00173 LSBOOL LSE_CALL operator < ( const LSG_STRUCT &_sSource ); 00174 } * LPLSG_STRUCT, * const LPCLSG_STRUCT; 00175 00179 typedef CMap<CString, LSG_STRUCT> LSG_STRUCT_ARRAY, * LPLSG_STRUCT_ARRAY, * const LPCLSG_STRUCT_ARRAY; 00180 00184 typedef struct LSG_STRUCT_DECLARATOR { 00188 LSUINT32 ui32Name; 00189 00193 LSUINT32 ui32Array; 00194 } * LPLSG_STRUCT_DECLARATOR, * const LPCLSG_STRUCT_DECLARATOR; 00195 00199 typedef struct LSG_ENGINE_MACRO { 00203 const LSCHAR * pcName; 00204 00208 LSUINT32 ui32Value; 00209 } * LPLSG_ENGINE_MACRO, * const LPCLSG_ENGINE_MACRO; 00210 00211 00212 // == Functions. 00218 LSG_SHADER_TYPES LSE_CALL GetShaderType() const; 00219 00229 LSUINT32 LSE_CALL CreateString( const LSCHAR * _pcText, LSBOOL _bHasQuotes = true ); 00230 00239 LSBOOL LSE_CALL CreateDecimal( const LSCHAR * _pcText, YYSTYPE::LSG_NODE_DATA &_ndNode ); 00240 00249 LSBOOL LSE_CALL CreateFloatingPoint( const LSCHAR * _pcText, YYSTYPE::LSG_NODE_DATA &_ndNode ); 00250 00258 LSBOOL LSE_CALL CreateBool( LSBOOL _bValue, YYSTYPE::LSG_NODE_DATA &_ndNode ); 00259 00267 LSBOOL LSE_CALL CreateIdentifier( const LSCHAR * _pcText, YYSTYPE::LSG_NODE_DATA &_ndNode ); 00268 00277 LSBOOL LSE_CALL CreateArrayAccess( const YYSTYPE::LSG_NODE_DATA &_ndBase, 00278 const YYSTYPE::LSG_NODE_DATA &_ndIndex, YYSTYPE::LSG_NODE_DATA &_ndNode ); 00279 00288 LSBOOL LSE_CALL CreatePostfixOrPrefixIncOrDec( const YYSTYPE::LSG_NODE_DATA &_ndOp, 00289 LSG_NODE _nType, YYSTYPE::LSG_NODE_DATA &_ndNode ); 00290 00299 LSBOOL LSE_CALL CreateUnaryOp( LSUINT32 _ui32Op, const YYSTYPE::LSG_NODE_DATA &_ndBase, 00300 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00301 00310 LSBOOL LSE_CALL CreateCast( LSUINT64 _ui64Type, const YYSTYPE::LSG_NODE_DATA &_ndBase, 00311 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00312 00323 LSBOOL LSE_CALL CreateMath( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00324 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00325 LSUINT32 _ui32Op, YYSTYPE::LSG_NODE_DATA &_ndNode ); 00326 00336 LSBOOL LSE_CALL CreateTertiary( const YYSTYPE::LSG_NODE_DATA &_ndCond, 00337 const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00338 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00339 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00340 00350 LSBOOL LSE_CALL CreateAssignment( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00351 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00352 LSUINT32 _ui32Op, 00353 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00354 00363 LSBOOL LSE_CALL CreateComma( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00364 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00365 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00366 00375 LSBOOL LSE_CALL CreateIntrinsic( LSUINT32 _ui32Intrinsic, 00376 const YYSTYPE::LSG_NODE_DATA &_ndExp, 00377 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00378 00387 LSBOOL LSE_CALL CreateArgExpList( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00388 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00389 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00390 00399 LSBOOL LSE_CALL CreateFunctionCall( const YYSTYPE::LSG_NODE_DATA &_ndFunction, 00400 LSUINT32 _ui32ArgList, 00401 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00402 00411 LSBOOL LSE_CALL CreateFieldSelect( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00412 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00413 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00414 00423 LSBOOL LSE_CALL CreateConstructor( LSUINT64 _ui64Type, 00424 LSUINT32 _ui32Args, 00425 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00426 00434 LSBOOL LSE_CALL CreateExpressionStatement( LSUINT32 _ui32Index, 00435 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00436 00444 LSBOOL LSE_CALL CreateDeclarationStatement( const YYSTYPE::LSG_NODE_DATA &_ndDecl, 00445 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00446 00455 LSBOOL LSE_CALL CreateSemantic( const LSCHAR * _pcText, 00456 LSUINT32 _ui32Type, 00457 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00458 00467 LSBOOL LSE_CALL CreateTypeSpecifier( LSUINT64 _ui64Qualifiers, 00468 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00469 00478 LSBOOL LSE_CALL CreateFullySpecifiedType( LSUINT64 _ui64Qualifiers, 00479 const YYSTYPE::LSG_NODE_DATA &_ndSpec, 00480 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00481 00493 LSBOOL LSE_CALL CreateSingleDeclaration( LSUINT32 _ui32Name, 00494 const YYSTYPE::LSG_NODE_DATA &_ndTypeNode, 00495 LSUINT32 _ui32ConstNodeIndex, 00496 LSUINT32 _ui32SemanticNodeIndex, 00497 LSUINT32 _ui32InitializerNodeIndex, 00498 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00499 00508 LSBOOL LSE_CALL CreateInitializerList( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00509 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00510 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00511 00519 LSBOOL LSE_CALL CreateInitializerListWrap( const YYSTYPE::LSG_NODE_DATA &_ndList, 00520 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00521 00530 LSBOOL LSE_CALL CreateStatementList( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00531 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00532 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00533 00541 LSBOOL LSE_CALL CreateNewScopedStatement( const YYSTYPE::LSG_NODE_DATA &_ndStatement, 00542 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00543 00550 LSBOOL LSE_CALL CreateBlankStatement( YYSTYPE::LSG_NODE_DATA &_ndNode ); 00551 00561 LSBOOL LSE_CALL CreateStructDeclarator( const YYSTYPE::LSG_NODE_DATA &_ndName, 00562 LSUINT32 _ui32ArrayNodeIndex, 00563 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00564 00573 LSBOOL LSE_CALL CreateStructDeclaratorList( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00574 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00575 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00576 00586 LSBOOL LSE_CALL CreateStructDeclaration( LSUINT64 _ui64Qualifiers, 00587 const YYSTYPE::LSG_NODE_DATA &_ndType, 00588 const YYSTYPE::LSG_NODE_DATA &_ndDecl, 00589 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00590 00599 LSBOOL LSE_CALL CreateStructDeclarationList( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00600 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00601 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00602 00612 LSBOOL LSE_CALL CreateStruct( LSUINT32 _ui32IdentifierIndex, 00613 const YYSTYPE::LSG_NODE_DATA &_ndDecl, 00614 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00615 00626 LSBOOL LSE_CALL CreateParameterDeclarator( const YYSTYPE::LSG_NODE_DATA &_ndType, 00627 const YYSTYPE::LSG_NODE_DATA &_ndName, 00628 LSUINT32 _ui32ArrayNodeIndex, 00629 LSUINT32 _ui32SemanticNodeIndex, 00630 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00631 00640 LSBOOL LSE_CALL CreateParameterDeclaration( LSUINT64 _ui64TypeInfo, 00641 const YYSTYPE::LSG_NODE_DATA &_ndDecl, 00642 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00643 00652 LSBOOL LSE_CALL CreateParameterDeclarationList( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00653 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00654 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00655 00665 LSBOOL LSE_CALL CreateFunctionDeclaration( const YYSTYPE::LSG_NODE_DATA &_ndType, 00666 const YYSTYPE::LSG_NODE_DATA &_ndName, 00667 LSUINT32 _ui32Parms, 00668 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00669 00678 LSBOOL LSE_CALL CreateFunctionDefinition( const YYSTYPE::LSG_NODE_DATA &_ndHeader, 00679 const YYSTYPE::LSG_NODE_DATA &_ndBody, 00680 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00681 00691 LSBOOL LSE_CALL CreateSelectionStatement( const YYSTYPE::LSG_NODE_DATA &_ndExp, 00692 const YYSTYPE::LSG_NODE_DATA &_ndBody, 00693 LSUINT32 _ui32ElseBody, 00694 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00695 00703 LSBOOL LSE_CALL CreateForInitDeclStatement( const YYSTYPE::LSG_NODE_DATA &_ndExp, 00704 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00705 00714 LSBOOL LSE_CALL CreateWhileLoop( const YYSTYPE::LSG_NODE_DATA &_ndExp, 00715 const YYSTYPE::LSG_NODE_DATA &_ndBody, 00716 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00717 00726 LSBOOL LSE_CALL CreateDoWhileLoop( const YYSTYPE::LSG_NODE_DATA &_ndExp, 00727 const YYSTYPE::LSG_NODE_DATA &_ndBody, 00728 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00729 00740 LSBOOL LSE_CALL CreateForLoop( const YYSTYPE::LSG_NODE_DATA &_ndInitExp, 00741 const YYSTYPE::LSG_NODE_DATA &_ndExp, 00742 LSUINT32 _ui32ItIndex, 00743 const YYSTYPE::LSG_NODE_DATA &_ndBody, 00744 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00745 00754 LSBOOL LSE_CALL CreateJump( LSG_NODE _nType, LSUINT32 _ui32NodeIndex, 00755 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00756 00765 LSBOOL LSE_CALL CreateExternalDeclarationList( const YYSTYPE::LSG_NODE_DATA &_ndLeft, 00766 const YYSTYPE::LSG_NODE_DATA &_ndRight, 00767 YYSTYPE::LSG_NODE_DATA &_ndNode ); 00768 00775 LSUINT32 LSE_CALL FindIdentifier( const LSCHAR * _pcName ) const; 00776 00783 LSBOOL LSE_CALL IsToken( const LSCHAR * _pcText ) const; 00784 00791 const LSG_SHADER_SYNTAX_NODES::LSG_NODE_DATA & LSE_CALL 00792 GetNode( LSUINT32 _ui32Index ) const; 00793 00799 LSUINT32 LSE_CALL TotalNodes() const; 00800 00806 LSUINT32 LSE_CALL TotalIdentifiers() const; 00807 00814 const LSG_IDENTIFIER & LSE_CALL GetIdentifier( LSUINT32 _ui32Index ) const; 00815 00821 LSUINT32 LSE_CALL TotalStrings() const; 00822 00829 const CString & LSE_CALL GetString( LSUINT32 _ui32Index ) const; 00830 00838 LSG_NUM_CONSTANTS LSE_CALL GetNodeValue( const YYSTYPE::LSG_NODE_DATA &_ndNode, LSG_SCALAR &_sValue ) const; 00839 00846 LSBOOL LSE_CALL IsInteger( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00847 00859 LSUINT32 LSE_CALL CountArgs( LSUINT32 _ui32ArgListIndex, LSUINT32 _ui32MaxArgs, LSUINT32 * _pui32Nodes ) const; 00860 00869 LSUINT32 LSE_CALL CountParms( LSUINT32 _ui32ArgListIndex, CVectorPoD<LSUINT32, LSUINT32> * _pvRet = NULL ); 00870 00878 LSUINT32 LSE_CALL CountStructMembers( LSUINT32 _ui32MemberListIndex, CVectorPoD<LSUINT32, LSUINT32> * _pvRet = NULL ); 00879 00887 LSBOOL LSE_CALL GetStructDeclarators( LSUINT32 _ui32Index, CVectorPoD<LSG_STRUCT_DECLARATOR> &_vRet ) const; 00888 00895 LSUINT64 LSE_CALL GetTypeQualifier( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00896 00903 LSUINT64 LSE_CALL GetType( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00904 00911 const CString & LSE_CALL GetName( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00912 00919 LSUINT32 LSE_CALL GetNameIndex( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00920 00928 LSUINT64 LSE_CALL GetSemantic( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00929 00936 LSUINT64 LSE_CALL GetTypeQualifiersOnParm( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00937 00944 LSUINT64 LSE_CALL GetTypeOnParm( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00945 00952 const CString & LSE_CALL GetNameOfParm( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00953 00960 LSUINT32 LSE_CALL GetNameIndexOfParm( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00961 00968 LSUINT32 LSE_CALL GetArrayIndexOfParm( const YYSTYPE::LSG_NODE_DATA &_ndNode ) const; 00969 00976 LSBOOL LSE_CALL RegisterStructType( const LSCHAR * _pcText ); 00977 00984 LSUINT32 LSE_CALL GetStructTypeId( const LSCHAR * _pcText ) const; 00985 00992 CString LSE_CALL GetStructById( LSUINT32 _ui32Id ) const; 00993 01001 LSUINT32 LSE_CALL GetSize( LSUINT64 _ui64Type ) const; 01002 01003 01010 static LSBOOL LSE_CALL IsInteger( LSUINT64 _ui64Type ); 01011 01019 static LSUINT32 LSE_CALL GetArrayUnit( LSUINT64 _ui64Type, LSUINT32 _ui32Unit ); 01020 01027 static LSUINT32 LSE_CALL GetType( LSUINT64 _ui64Type ); 01028 01037 static LSUINT64 LSE_CALL CombineTypesAndArrays( LSUINT64 _ui64Type, LSUINT32 _ui32Array0, LSUINT32 _ui32Array1 ); 01038 01045 static LSG_NUM_CONSTANTS LSE_CALL TypeToConstantType( LSUINT64 _ui64Type ); 01046 01053 static LSUINT64 LSE_CALL ConstantTypeToType( LSG_NUM_CONSTANTS _ncType ); 01054 01061 static CString LSE_CALL BasicTypeToString( LSUINT64 _ui64Type ); 01062 01072 static LSG_SCALAR LSE_CALL CastScalar( const LSG_SCALAR &_sScalar, LSUINT64 _ui64OriginalType, LSUINT64 _ui64NewType, LSBOOL &_bRes ); 01073 01081 static LSG_NUM_CONSTANTS LSE_CALL GetHighType( LSG_NUM_CONSTANTS _ncLeft, LSG_NUM_CONSTANTS _ncRight ); 01082 01090 static LSBOOL LSE_CALL IsEitherMatrix( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01091 01099 static LSBOOL LSE_CALL BothAreMatrices( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01100 01108 static LSBOOL LSE_CALL IsEitherVector( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01109 01117 static LSBOOL LSE_CALL BothAreVectors( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01118 01126 static LSBOOL LSE_CALL IsEitherScalar( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01127 01135 static LSBOOL LSE_CALL BothAreScalars( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01136 01144 static LSBOOL LSE_CALL IsEitherStruct( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01145 01153 static LSBOOL LSE_CALL BothAreStructs( LSUINT64 _ui64Left, LSUINT64 _ui64Right ); 01154 01163 static LSVOID LSE_CALL GetMatrixSize( LSUINT64 _ui64Left, LSUINT64 _ui64Right, 01164 LSUINT32 &_ui32Columns, LSUINT32 &_ui32Rows ); 01165 01173 static LSVOID LSE_CALL GetVectorSize( LSUINT64 _ui64Left, LSUINT64 _ui64Right, 01174 LSUINT32 &_ui32Ret ); 01175 01176 01177 protected : 01178 // == Members. 01182 CVector<CString, LSUINT32, 512UL> m_vStringPool; 01183 01187 CVectorPoD<LSG_SHADER_SYNTAX_NODES::LSG_NODE_DATA, LSUINT32, 512UL * 10UL> 01188 m_vNodes; 01189 01193 CVectorPoD<LSG_IDENTIFIER, LSUINT32, 512UL> m_vIdentifiers; 01194 01198 CVectorPoD<LSUINT32, LSUINT32, 512UL> m_vSortedTokens; 01199 01204 CShaderScopeStack m_sssScopes; 01205 01209 LSG_SHADER_TYPES m_stShaderType; 01210 01215 CMap<CString, LSUINT32> m_mUserTypes; 01216 01220 LSUINT32 m_ui32TypeId; 01221 01225 LSG_STRUCT_ARRAY m_saStructures; 01226 01230 CShaderLexer * m_plLexer; 01231 01232 01233 // == Functions. 01240 LSBOOL LSE_CALL AddNode( LSG_SHADER_SYNTAX_NODES::LSG_NODE_DATA &_ndNode ); 01241 01249 LSUINT32 LSE_CALL AddIdentifier( const LSCHAR * _pcText ); 01250 01258 LSBOOL LSE_CALL FindToken( const LSCHAR * _pcName, LSUINT32 &_ui32Index ) const; 01259 01260 private : 01261 }; 01262 01263 } // namespace lsg 01264 01265 #endif // __LSG_SHADERLANGUAGEPARSER_H__