CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
CeresEngine::ShaderCompiler::PreProcessor Class Reference

Pre-processor to substitute macros and include directives. More...

#include <CeresEngine/Material/ShaderCompiler/Frontend/PreProcessor.hpp>

Inheritance diagram for CeresEngine::ShaderCompiler::PreProcessor:
CeresEngine::ShaderCompiler::Parser CeresEngine::ShaderCompiler::GLSLPreProcessor

Classes

struct  IfBlock
 
struct  Macro
 

Public Member Functions

 PreProcessor (IncludeHandler &includeHandler, Log *log=nullptr)
 
UPtr< std::iostream > process (const SourceCodePtr &input, const String &filename="", bool writeLineMarks=true, bool writeLineMarkFilenames=true, bool enableWarnings=false)
 
Vector< StringlistDefinedMacroIdents () const
 
- Public Member Functions inherited from CeresEngine::ShaderCompiler::Parser
virtual ~Parser ()=default
 

Protected Types

using MacroPtr = SPtr< Macro >
 
- Protected Types inherited from CeresEngine::ShaderCompiler::Parser
using Tokens = Token::Types
 
using BinaryOpList = InitializerList< BinaryOp >
 

Protected Member Functions

virtual void parseDirective (const String &directive, bool ignoreUnknown)
 
virtual void writeLineDirective (UInt32 lineNo, const String &filename)
 
void ignoreDirective ()
 
void defineMacro (const Macro &macro)
 
void defineStandardMacro (const String &ident, Int32 intValue=1)
 
void undefineMacro (const String &ident, const Token *token=nullptr)
 
bool isDefined (const String &ident) const
 
virtual bool onDefineMacro (const Macro &macro)
 
virtual bool onRedefineMacro (const Macro &macro, const Macro &previousMacro)
 
virtual bool onUndefineMacro (const Macro &macro)
 
virtual bool onSubstituteStdMacro (const Token &identifierToken, TokenPtrString &tokenString)
 
Variant evaluateExpression (const TokenPtrString &tokenString, const Token *token=nullptr)
 
Variant parseAndEvaluateExpression (const Token *token=nullptr)
 
Variant parseAndEvaluateArgumentExpression (const Token *token=nullptr)
 
StringStreamgetOutputStream ()
 
- Protected Member Functions inherited from CeresEngine::ShaderCompiler::Parser
 Parser (Log *log)
 
void error (const String &msg, const SourceArea &area, bool breakWithException=true)
 
void error (const String &msg, const Token *token, bool breakWithException=true)
 
void error (const String &msg, bool prevToken=true, bool breakWithException=true)
 
void errorUnexpected (const String &hint="", const Token *token=nullptr, bool breakWithException=false)
 
void errorUnexpected (const Tokens type, const Token *token=nullptr, bool breakWithException=false)
 
void errorInternal (const String &msg, const String &procName)
 
void warning (const String &msg, const SourceArea &area)
 
void warning (const String &msg, const Token *token)
 
void warning (const String &msg, bool prevToken=true)
 
void enableWarnings (bool enable)
 
ParsingState getActiveParsingState () const
 
ScannergetScanner ()
 
String getCurrentFilename () const
 
TokenPtr accept (const Tokens type)
 
TokenPtr accept (const Tokens type, const String &spell)
 
virtual TokenPtr acceptIt ()
 
void pushTokenString (const TokenPtrString &tokenString)
 
void popTokenString ()
 
void ignoreWhiteSpaces (bool includeNewLines=false, bool includeComments=false)
 
void ignoreNewLines ()
 
template<typename T >
const TupdateSourceArea (const T &ast, const AST *areaOriginAST=nullptr)
 
template<typename T >
const TupdateSourceArea (const T &ast, const ASTPtr &firstAreaOriginAST, const ASTPtr &lastAreaOriginAST)
 
template<typename T >
const TupdateSourceAreaOffset (const T &ast)
 
void pushParsingState (const ParsingState &state)
 
void popParsingState ()
 
void pushPreParsedAST (const ASTPtr &ast)
 Pushes the specified AST node onto the stack of pre-parsed AST nodes.
 
ASTPtr popPreParsedAST ()
 
ExpressionPtr parseGenericExpression ()
 
TernaryExpressionPtr parseTernaryExpression (const ExpressionPtr &condExpression)
 
ExpressionPtr parseLogicOrExpression ()
 
ExpressionPtr parseLogicAndExpression ()
 
ExpressionPtr parseBitwiseOrExpression ()
 
ExpressionPtr parseBitwiseXOrExpression ()
 
ExpressionPtr parseBitwiseAndExpression ()
 
ExpressionPtr parseEqualityExpression ()
 
ExpressionPtr parseRelationExpression ()
 
ExpressionPtr parseShiftExpression ()
 
ExpressionPtr parseAddExpression ()
 
ExpressionPtr parseSubExpression ()
 
ExpressionPtr parseMulExpression ()
 
ExpressionPtr parseDivExpression ()
 
ExpressionPtr parseValueExpression ()
 
Int32 parseIntLiteral (TokenPtr token=nullptr)
 
Int32 parseIntLiteral (const String &valueStr, const Token *token=nullptr)
 
LoggetLog () const
 
ReportHandlergetReportHandler ()
 
NameManglinggetNameMangling ()
 
const StringfindNameManglingPrefix (const String &ident) const
 
template<typename T , typename... Args>
SPtr< Tmake (Args &&... args)
 
const TokenPtrgetToken () const
 
Tokens getTokenType () const
 
bool is (const Tokens type) const
 
bool is (const Tokens type, const String &spell) const
 

Private Member Functions

ScannerPtr makeScanner () override
 
void pushScannerSource (const SourceCodePtr &source, const String &filename="") override
 
bool popScannerSource () override
 
void pushIfBlock (const TokenPtr &directiveToken, bool active=false, bool elseAllowed=true)
 
void setIfBlock (const TokenPtr &directiveToken, bool active=false, bool elseAllowed=true)
 
void popIfBlock ()
 
IfBlock getTopIfBlock () const
 
TokenPtrString expandMacro (const Macro &macro, const Vector< TokenPtrString > &arguments)
 Replaces all identifiers (specified by 'macro.parameters') in the token string (specified by 'macro.tokenString') by the respective replacement (specified by 'arguments').
 
void writePosToLineDirective ()
 
void parseProgram ()
 
void paresComment ()
 
void parseIdent ()
 
TokenPtrString parseIdentAsTokenString ()
 
TokenPtrString parseIdentArgumentsForMacro (const TokenPtr &identifierToken, const Macro &macro)
 
void parseMisc ()
 
void parseDirective ()
 
void parseAnyIfDirectiveAndSkipValidation ()
 
void parseDirectiveDefine ()
 
void parseDirectiveUndef ()
 
void parseDirectiveInclude ()
 
void parseDirectiveIf (bool skipEvaluation=false)
 
void parseDirectiveIfdef (bool skipEvaluation=false)
 
void parseDirectiveIfndef (bool skipEvaluation=false)
 
void parseDirectiveElif (bool skipEvaluation=false)
 
void parseDirectiveIfOrElifCondition (bool isElseBranch, bool skipEvaluation=false)
 
void parseDirectiveElse ()
 
void parseDirectiveEndif ()
 
void parseDirectivePragma ()
 
void parseDirectiveLine ()
 
void parseDirectiveError ()
 
void parseDirectiveSpecialization ()
 
ExpressionPtr parseExpression ()
 
ExpressionPtr parsePrimaryExpression () override
 
TokenPtrString parseDirectiveTokenString (bool expandDefinedDirective=false, bool ignoreComments=false)
 
TokenPtrString parseArgumentTokenString ()
 
String parseDefinedMacro ()
 
String parseDefinedSpecialization ()
 

Private Attributes

IncludeHandlermIncludeHandler
 
UPtr< StringStreammOutput
 
Map< String, MacroPtrmMacros
 
Set< StringmOnceIncluded
 
Map< String, std::size_t > mIncludeCounter
 
Stack< IfBlockmIfBlockStack
 Stack to store the info which if-block in the hierarchy is active.
 
bool mWriteLineMarks = true
 
bool mWriteLineMarkFilenames = true
 

Detailed Description

Pre-processor to substitute macros and include directives.

The preprocessor works on something similar to a Concrete Syntax Tree (CST) rather than an Abstract Syntax Tree (AST). This is because the output is not an intermediate representation but rather concrete source code. Therefore, all white spaces and new-line characters must NOT be ignored. All other parsers and analyzers only work on an AST.

Member Typedef Documentation

◆ MacroPtr

Constructor & Destructor Documentation

◆ PreProcessor()

CeresEngine::ShaderCompiler::PreProcessor::PreProcessor ( IncludeHandler includeHandler,
Log log = nullptr 
)

Member Function Documentation

◆ defineMacro()

void CeresEngine::ShaderCompiler::PreProcessor::defineMacro ( const Macro macro)
protected

◆ defineStandardMacro()

void CeresEngine::ShaderCompiler::PreProcessor::defineStandardMacro ( const String ident,
Int32  intValue = 1 
)
protected

◆ evaluateExpression()

Variant CeresEngine::ShaderCompiler::PreProcessor::evaluateExpression ( const TokenPtrString tokenString,
const Token token = nullptr 
)
protected

◆ expandMacro()

TokenPtrString CeresEngine::ShaderCompiler::PreProcessor::expandMacro ( const Macro macro,
const Vector< TokenPtrString > &  arguments 
)
private

Replaces all identifiers (specified by 'macro.parameters') in the token string (specified by 'macro.tokenString') by the respective replacement (specified by 'arguments').

The number of identifiers and the number of replacements must be equal.

◆ getOutputStream()

StringStream & CeresEngine::ShaderCompiler::PreProcessor::getOutputStream ( )
inlineprotected

◆ getTopIfBlock()

IfBlock CeresEngine::ShaderCompiler::PreProcessor::getTopIfBlock ( ) const
private

◆ ignoreDirective()

void CeresEngine::ShaderCompiler::PreProcessor::ignoreDirective ( )
protected

◆ isDefined()

bool CeresEngine::ShaderCompiler::PreProcessor::isDefined ( const String ident) const
protected

◆ listDefinedMacroIdents()

Vector< String > CeresEngine::ShaderCompiler::PreProcessor::listDefinedMacroIdents ( ) const

◆ makeScanner()

ScannerPtr CeresEngine::ShaderCompiler::PreProcessor::makeScanner ( )
overrideprivatevirtual

◆ onDefineMacro()

virtual bool CeresEngine::ShaderCompiler::PreProcessor::onDefineMacro ( const Macro macro)
protectedvirtual

◆ onRedefineMacro()

virtual bool CeresEngine::ShaderCompiler::PreProcessor::onRedefineMacro ( const Macro macro,
const Macro previousMacro 
)
protectedvirtual

◆ onSubstituteStdMacro()

virtual bool CeresEngine::ShaderCompiler::PreProcessor::onSubstituteStdMacro ( const Token identifierToken,
TokenPtrString tokenString 
)
protectedvirtual

◆ onUndefineMacro()

virtual bool CeresEngine::ShaderCompiler::PreProcessor::onUndefineMacro ( const Macro macro)
protectedvirtual

◆ paresComment()

void CeresEngine::ShaderCompiler::PreProcessor::paresComment ( )
private

◆ parseAndEvaluateArgumentExpression()

Variant CeresEngine::ShaderCompiler::PreProcessor::parseAndEvaluateArgumentExpression ( const Token token = nullptr)
protected

◆ parseAndEvaluateExpression()

Variant CeresEngine::ShaderCompiler::PreProcessor::parseAndEvaluateExpression ( const Token token = nullptr)
protected

◆ parseAnyIfDirectiveAndSkipValidation()

void CeresEngine::ShaderCompiler::PreProcessor::parseAnyIfDirectiveAndSkipValidation ( )
private

◆ parseArgumentTokenString()

TokenPtrString CeresEngine::ShaderCompiler::PreProcessor::parseArgumentTokenString ( )
private

◆ parseDefinedMacro()

String CeresEngine::ShaderCompiler::PreProcessor::parseDefinedMacro ( )
private

◆ parseDefinedSpecialization()

String CeresEngine::ShaderCompiler::PreProcessor::parseDefinedSpecialization ( )
private

◆ parseDirective() [1/2]

void CeresEngine::ShaderCompiler::PreProcessor::parseDirective ( )
private

◆ parseDirective() [2/2]

virtual void CeresEngine::ShaderCompiler::PreProcessor::parseDirective ( const String directive,
bool  ignoreUnknown 
)
protectedvirtual

◆ parseDirectiveDefine()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveDefine ( )
private

◆ parseDirectiveElif()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveElif ( bool  skipEvaluation = false)
private

◆ parseDirectiveElse()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveElse ( )
private

◆ parseDirectiveEndif()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveEndif ( )
private

◆ parseDirectiveError()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveError ( )
private

◆ parseDirectiveIf()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveIf ( bool  skipEvaluation = false)
private

◆ parseDirectiveIfdef()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveIfdef ( bool  skipEvaluation = false)
private

◆ parseDirectiveIfndef()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveIfndef ( bool  skipEvaluation = false)
private

◆ parseDirectiveIfOrElifCondition()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveIfOrElifCondition ( bool  isElseBranch,
bool  skipEvaluation = false 
)
private

◆ parseDirectiveInclude()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveInclude ( )
private

◆ parseDirectiveLine()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveLine ( )
private

◆ parseDirectivePragma()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectivePragma ( )
private

◆ parseDirectiveSpecialization()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveSpecialization ( )
private

◆ parseDirectiveTokenString()

TokenPtrString CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveTokenString ( bool  expandDefinedDirective = false,
bool  ignoreComments = false 
)
private

◆ parseDirectiveUndef()

void CeresEngine::ShaderCompiler::PreProcessor::parseDirectiveUndef ( )
private

◆ parseExpression()

ExpressionPtr CeresEngine::ShaderCompiler::PreProcessor::parseExpression ( )
private

◆ parseIdent()

void CeresEngine::ShaderCompiler::PreProcessor::parseIdent ( )
private

◆ parseIdentArgumentsForMacro()

TokenPtrString CeresEngine::ShaderCompiler::PreProcessor::parseIdentArgumentsForMacro ( const TokenPtr identifierToken,
const Macro macro 
)
private

◆ parseIdentAsTokenString()

TokenPtrString CeresEngine::ShaderCompiler::PreProcessor::parseIdentAsTokenString ( )
private

◆ parseMisc()

void CeresEngine::ShaderCompiler::PreProcessor::parseMisc ( )
private

◆ parsePrimaryExpression()

ExpressionPtr CeresEngine::ShaderCompiler::PreProcessor::parsePrimaryExpression ( )
overrideprivatevirtual

◆ parseProgram()

void CeresEngine::ShaderCompiler::PreProcessor::parseProgram ( )
private

◆ popIfBlock()

void CeresEngine::ShaderCompiler::PreProcessor::popIfBlock ( )
private

◆ popScannerSource()

bool CeresEngine::ShaderCompiler::PreProcessor::popScannerSource ( )
overrideprivatevirtual

◆ process()

UPtr< std::iostream > CeresEngine::ShaderCompiler::PreProcessor::process ( const SourceCodePtr input,
const String filename = "",
bool  writeLineMarks = true,
bool  writeLineMarkFilenames = true,
bool  enableWarnings = false 
)

◆ pushIfBlock()

void CeresEngine::ShaderCompiler::PreProcessor::pushIfBlock ( const TokenPtr directiveToken,
bool  active = false,
bool  elseAllowed = true 
)
private

◆ pushScannerSource()

void CeresEngine::ShaderCompiler::PreProcessor::pushScannerSource ( const SourceCodePtr source,
const String filename = "" 
)
overrideprivatevirtual

◆ setIfBlock()

void CeresEngine::ShaderCompiler::PreProcessor::setIfBlock ( const TokenPtr directiveToken,
bool  active = false,
bool  elseAllowed = true 
)
private

◆ undefineMacro()

void CeresEngine::ShaderCompiler::PreProcessor::undefineMacro ( const String ident,
const Token token = nullptr 
)
protected

◆ writeLineDirective()

virtual void CeresEngine::ShaderCompiler::PreProcessor::writeLineDirective ( UInt32  lineNo,
const String filename 
)
protectedvirtual

◆ writePosToLineDirective()

void CeresEngine::ShaderCompiler::PreProcessor::writePosToLineDirective ( )
private

Member Data Documentation

◆ mIfBlockStack

Stack<IfBlock> CeresEngine::ShaderCompiler::PreProcessor::mIfBlockStack
private

Stack to store the info which if-block in the hierarchy is active.

Once an if-block is inactive, all subsequent if-blocks are inactive, too.

◆ mIncludeCounter

Map<String, std::size_t> CeresEngine::ShaderCompiler::PreProcessor::mIncludeCounter
private

◆ mIncludeHandler

IncludeHandler& CeresEngine::ShaderCompiler::PreProcessor::mIncludeHandler
private

◆ mMacros

Map<String, MacroPtr> CeresEngine::ShaderCompiler::PreProcessor::mMacros
private

◆ mOnceIncluded

Set<String> CeresEngine::ShaderCompiler::PreProcessor::mOnceIncluded
private

◆ mOutput

UPtr<StringStream> CeresEngine::ShaderCompiler::PreProcessor::mOutput
private

◆ mWriteLineMarkFilenames

bool CeresEngine::ShaderCompiler::PreProcessor::mWriteLineMarkFilenames = true
private

◆ mWriteLineMarks

bool CeresEngine::ShaderCompiler::PreProcessor::mWriteLineMarks = true
private

The documentation for this class was generated from the following file: