#include <OgreCompiler2Pass.h>
Inheritance diagram for Ogre::Compiler2Pass:
Public Member Functions | |
Compiler2Pass () | |
constructor | |
virtual | ~Compiler2Pass () |
bool | compile (const String &source, const String &sourceName) |
compile the source - performs 2 passes. | |
virtual const String & | getClientBNFGrammer (void)=0 |
gets BNF Grammer. | |
virtual const String & | getClientGrammerName (void)=0 |
get the name of the BNF grammer. | |
Protected Types | |
typedef std::vector< TokenRule > | TokenRuleContainer |
typedef TokenRuleContainer::iterator | TokenRuleIterator |
typedef std::vector< LexemeTokenDef > | LexemeTokenDefContainer |
typedef LexemeTokenDefContainer::iterator | LexemeTokenDefIterator |
typedef std::map< std::string, size_t > | LexemeTokenMap |
typedef LexemeTokenMap::iterator | TokenKeyIterator |
typedef std::vector< TokenInst > | TokenInstContainer |
typedef TokenInstContainer::iterator | TokenInstIterator |
enum | OperationType { otUNKNOWN, otRULE, otAND, otOR, otOPTIONAL, otREPEAT, otDATA, otNOT_TEST, otEND } |
enum | SystemRuleToken { _no_token_ = SystemTokenBase, _character_, _value_, _no_space_skip_ } |
enum | BNF_ID { BNF_UNKOWN = 0, BNF_SYNTAX, BNF_RULE, BNF_IDENTIFIER, BNF_IDENTIFIER_RIGHT, BNF_IDENTIFIER_CHARACTERS, BNF_ID_BEGIN, BNF_ID_END, BNF_CONSTANT_BEGIN, BNF_SET_RULE, BNF_EXPRESSION, BNF_AND_TERM, BNF_OR_TERM, BNF_TERM, BNF_TERM_ID, BNF_CONSTANT, BNF_OR, BNF_TERMINAL_SYMBOL, BNF_TERMINAL_START, BNF_REPEAT_EXPRESSION, BNF_REPEAT_BEGIN, BNF_REPEAT_END, BNF_SET, BNF_SET_BEGIN, BNF_SET_END, BNF_NOT_TEST, BNF_NOT_TEST_BEGIN, BNF_OPTIONAL_EXPRESSION, BNF_NOT_EXPRESSION, BNF_NOT_CHK, BNF_OPTIONAL_BEGIN, BNF_OPTIONAL_END, BNF_NO_TOKEN_START, BNF_SINGLEQUOTE, BNF_SINGLE_QUOTE_EXC, BNF_SET_END_EXC, BNF_ANY_CHARACTER, BNF_SPECIAL_CHARACTERS1, BNF_SPECIAL_CHARACTERS2, BNF_WHITE_SPACE_CHK, BNF_LETTER, BNF_LETTER_DIGIT, BNF_DIGIT, BNF_WHITE_SPACE, BNF_ALPHA_SET, BNF_NUMBER_SET, BNF_SPECIAL_CHARACTER_SET1, BNF_SPECIAL_CHARACTER_SET2, BNF_SPECIAL_CHARACTER_SET3, BNF_NOT_CHARS } |
Protected Member Functions | |
bool | doPass1 () |
perform pass 1 of compile process scans source for lexemes that can be tokenized and then performs general semantic and context verification on each lexeme before it is tokenized. | |
bool | doPass2 () |
performs Pass 2 of compile process which is execution of the tokens | |
virtual void | executeTokenAction (const size_t tokenID)=0 |
execute the action associated with the token pointed to by the Pass 2 token instruction position. | |
virtual void | setupTokenDefinitions (void)=0 |
setup client token definitions. | |
const TokenInst & | getNextToken (const size_t expectedTokenID=0) |
Gets the next token from the instruction que. | |
const TokenInst & | getCurrentToken (void) |
Gets the current token from the instruction que. | |
bool | testNextTokenID (const size_t expectedTokenID) |
If a next token instruction exist then test if its token ID matches. | |
void | replaceToken (void) |
float | getNextTokenValue (void) |
Gets the next token's associated floating point value in the instruction que that was parsed from the text source. | |
const String & | getNextTokenLabel (void) |
Gets the next token's associated text label in the instruction que that was parsed from the text source. | |
size_t | getPass2TokenQueCount (void) const |
Gets the number of tokens waiting in the instruction que that need to be processed by an token action in pass 2. | |
size_t | getRemainingTokensForAction (void) const |
Get the number of tokens not processed by action token. | |
void | addLexemeToken (const String &lexeme, const size_t token, const bool hasAction=false, const bool caseSensitive=false) |
Add a lexeme token association. | |
void | setClientBNFGrammer (void) |
sets up the parser rules for the client based on the BNF Grammer text passed in. | |
void | findEOL () |
find the eol charater | |
bool | isFloatValue (float &fvalue, size_t &charsize) const |
check to see if the text at the present position in the source is a numerical constant | |
bool | isCharacterLabel (const size_t rulepathIDX) |
Check if source at current position is supposed to be a user defined character label. | |
bool | isLexemeMatch (const String &lexeme, const bool caseSensitive) const |
check to see if the text is in the lexeme text library | |
bool | positionToNextLexeme () |
position to the next possible valid sysmbol | |
bool | processRulePath (size_t rulepathIDX) |
process input source text using rulepath to determine allowed tokens | |
void | setActiveContexts (const uint contexts) |
setup ActiveContexts - should be called by subclass to setup initial language contexts | |
void | skipComments () |
comment specifiers are hard coded | |
void | skipEOL () |
find end of line marker and move past it | |
void | skipWhiteSpace () |
skip all the white space which includes spaces and tabs | |
bool | ValidateToken (const size_t rulepathIDX, const size_t activeRuleID) |
check if current position in source has the lexeme text equivalent to the TokenID | |
void | verifyTokenRuleLinks (const String &grammerName) |
scan through all the rules and initialize token definition with index to rules for non-terminal tokens. | |
void | checkTokenActionTrigger (void) |
Checks the last token instruction and if it has an action then it triggers the action of the previously found token having an action. | |
String | getBNFGrammerTextFromRulePath (size_t ruleID) |
Get the text representation of the rule path. | |
Protected Attributes | |
TokenState * | mClientTokenState |
TokenState * | mActiveTokenState |
Active token que, definitions, rules currntly being used by parser. | |
size_t | mPass2TokenQuePosition |
the location within the token instruction container where pass 2 is | |
size_t | mPreviousActionQuePosition |
the que position of the previous token that had an action. | |
const String * | mSource |
pointer to the source to be compiled | |
String | mSourceName |
name of the source to be compiled | |
size_t | mEndOfSource |
size_t | mCurrentLine |
size_t | mCharPos |
current line number in source being tokenized | |
std::map< size_t, float > | mConstants |
storage container for constants defined in source container uses Token index as a key associated with a float constant | |
std::map< size_t, String > | mLabels |
storage container for string labels defined in source container uses Token index as a key associated with a label | |
bool | mLabelIsActive |
flag indicates when a label is being parsed. | |
size_t | mActiveLabelKey |
the key of the active label being built during pass 1. | |
bool | mNoSpaceSkip |
flag being true indicates that spaces are not to be skipped automatically gets set to false when mLabelIsActive goes to false | |
bool | mNoTerminalToken |
if flag is true then next terminal token is not added to token que if found but does effect rule path flow | |
uint | mActiveContexts |
Active Contexts pattern used in pass 1 to determine which tokens are valid for a certain context. | |
Static Protected Attributes | |
const size_t | SystemTokenBase = 1000 |
Private Types | |
typedef std::map< String, TokenState > | TokenStateContainer |
Private Member Functions | |
void | activatePreviousTokenAction (void) |
if a previous token action was setup then activate it now | |
void | initBNFCompiler (void) |
initialize token definitions and rule paths | |
void | buildClientBNFRulePaths (void) |
Convert BNF grammer token que created in pass 1 into a BNF rule path. | |
void | modifyLastRule (const OperationType pendingRuleOp, const size_t tokenID) |
modify the last rule in the container. An end operation is added to the rule path. | |
size_t | getClientLexemeTokenID (const String &lexeme, const bool isCaseSensitive=false) |
get the token ID for a lexeme in the client state. | |
void | extractNonTerminal (const OperationType pendingRuleOp) |
Extract a Non Terminal identifier from the token que. | |
void | extractTerminal (const OperationType pendingRuleOp, const bool notoken=false) |
Extract a Terminal lexeme from the token que and add to current rule expression. | |
void | extractSet (const OperationType pendingRuleOp) |
Extract a set from the token que and add to current rule expression. | |
void | extractNumericConstant (const OperationType pendingRuleOp) |
Extract a numeric constant from the token que and add it to the current rule expression. | |
String | getLexemeText (size_t &ruleID) |
Static Private Attributes | |
TokenState | mBNFTokenState |
TokenStateContainer | mClientTokenStates |
PASS 2 - generate application specific instructions ie native instructions based on the tokens in the instruction container.
<> angle brackets are used to surround syntax rule names. A syntax rule name is also called a non-terminal in that it does not generate a terminal token in the instruction container for pass 2 processing.
| meaning "or". if the item on the left of the | fails then the item on the right is tested. Example: ::= 'true' | 'false'; whitespace is used to imply AND operation between left and right items. Example: ::= 'terrain_shadows' the 'terrain_shadows' terminal token must be found and rule must pass in order for rule to pass.
[] optional rule identifier is enclosed in meta symbols [ and ]. Note that only one identifier or terminal token can take [] modifier. {} repetitive identifier (zero or more times) is enclosed in meta symbols { and } Note that only one identifier or terminal token can take {} modifier. '' terminal tokens are surrounded by single quotes. A terminal token is always one or more characters. For example: 'Colour' defines a character sequence that must be matched in whole. Note that matching is case sensitive. @ turn on single character scanning and don't skip white space. Mainly used for label processing that allow white space. Example: '@ ' prevents the white space between the quotes from being skipped -'' no terminal token is generated when a - precedes the first single quote but the text in between the quotes is still tested against the characters in the source being parsed. (?! ) negative lookahead (not test) inspired by Perl 5. Scans ahead for a non-terminal or terminal expression that should fail in order to make the rule production pass. Does not generate a token or advance the cursur. If the lookahead result fails ie token is found, then the current rule fails and rollback occurs. Mainly used to solve multiple contexts of a token. An Example of where not test is used to solve multiple contexts:
::= "::=" ::= { } ::= "|" ::= { } ::= | | | ::= (?!"::=")
appears on both sides of the ::= so (?!"::=") test to make sure that ::= is not on the right which would indicate that a new rule was being formed.
Works on both terminals and non-terminals. Note: lookahead failure cause the whole rule to fail and rollback to occur
<#name> # indicates that a numerical value is to be parsed to form a terminal token. Name is optional and is just a descriptor to help with understanding what the value will be used for. Example: ::= <#red> <#green> <#blue>
() parentheses enclose a set of characters that can be used to generate a user identifier. for example: (0123456789) matches a single character found in that set. An example of a user identifier:
::= {} ::= (abcdefghijklmnopqrstuvwxyz)
This will generate a rule that accepts one or more lowercase letters to make up the Label. The User identifier stops collecting the characters into a string when a match cannot be found in the rule.
Definition at line 114 of file OgreCompiler2Pass.h.
|
Definition at line 185 of file OgreCompiler2Pass.h. |
|
Definition at line 186 of file OgreCompiler2Pass.h. |
|
Definition at line 188 of file OgreCompiler2Pass.h. |
|
Definition at line 203 of file OgreCompiler2Pass.h. |
|
Definition at line 204 of file OgreCompiler2Pass.h. |
|
Definition at line 189 of file OgreCompiler2Pass.h. |
|
Definition at line 135 of file OgreCompiler2Pass.h. |
|
Definition at line 136 of file OgreCompiler2Pass.h. |
|
Definition at line 449 of file OgreCompiler2Pass.h. |
|
Definition at line 146 of file OgreCompiler2Pass.h. |
|
Definition at line 120 of file OgreCompiler2Pass.h. |
|
Definition at line 139 of file OgreCompiler2Pass.h. |
|
constructor
|
|
Definition at line 478 of file OgreCompiler2Pass.h. |
|
if a previous token action was setup then activate it now
|
|
Add a lexeme token association. The backend compiler uses the associations between lexeme and token when building the rule base from the BNF script so all associations must be done prior to compiling a source.
|
|
Convert BNF grammer token que created in pass 1 into a BNF rule path.
|
|
Checks the last token instruction and if it has an action then it triggers the action of the previously found token having an action.
|
|
compile the source - performs 2 passes. First pass is to tokinize, check semantics and context. The second pass is performed by using tokens to look up function implementors and executing them which convert tokens to application specific instructions.
|
|
perform pass 1 of compile process scans source for lexemes that can be tokenized and then performs general semantic and context verification on each lexeme before it is tokenized. A tokenized instruction list is built to be used by Pass 2. A rule path can trigger Pass 2 execution if enough tokens have been generated in Pass 1. Pass 1 will then pass control to pass 2 temporarily until the current tokens have been consumed. |
|
performs Pass 2 of compile process which is execution of the tokens
|
|
execute the action associated with the token pointed to by the Pass 2 token instruction position. Its upto the child class to implement how it will associate a token key with and action. Actions should be placed at positions withing the BNF grammer (instruction que) that indicate enough tokens exist for pass 2 processing to take place. Implemented in Ogre::CompositorScriptCompiler, and Ogre::MaterialScriptCompiler. |
|
Extract a Non Terminal identifier from the token que.
|
|
Extract a numeric constant from the token que and add it to the current rule expression.
|
|
Extract a set from the token que and add to current rule expression.
|
|
Extract a Terminal lexeme from the token que and add to current rule expression.
|
|
find the eol charater
|
|
Get the text representation of the rule path. This is a good way to way to visually verify that the BNF grammer did compile correctly.
|
|
gets BNF Grammer. Gets called when BNF grammer has to be compiled for the first time. Implemented in Ogre::CompositorScriptCompiler, and Ogre::MaterialScriptCompiler. |
|
get the name of the BNF grammer.
Implemented in Ogre::CompositorScriptCompiler, and Ogre::MaterialScriptCompiler. |
|
get the token ID for a lexeme in the client state. If the lexeme is not found then it is added to the map and definition container and a new tokenID created.
|
|
Gets the current token from the instruction que.
|
|
|
|
Gets the next token from the instruction que. If an unkown token is found then an exception is raised but the instruction pointer is still moved passed the unknown token. The subclass should catch the exception, provide an error message, and attempt recovery.
|
|
Gets the next token's associated text label in the instruction que that was parsed from the text source. If an unkown token is found or no associated label was found then an exception is raised but the instruction pointer is still moved passed the unknown token. The subclass should catch the exception, provide an error message, and attempt recovery. |
|
Gets the next token's associated floating point value in the instruction que that was parsed from the text source. If an unkown token is found or no associated value was found then an exception is raised but the instruction pointer is still moved passed the unknown token. The subclass should catch the exception, provide an error message, and attempt recovery. |
|
Gets the number of tokens waiting in the instruction que that need to be processed by an token action in pass 2.
|
|
Get the number of tokens not processed by action token. Client Actions should use this method to retreive the number of parameters(tokens) remaining to be processed in the action. |
|
initialize token definitions and rule paths
|
|
Check if source at current position is supposed to be a user defined character label. A new label is processed when previous operation was not _character_ otherwise the processed character (if match was found) is added to the current label. This allows _character_ operations to be chained together to form a crude regular expression to build a label.
|
|
check to see if the text at the present position in the source is a numerical constant
|
|
check to see if the text is in the lexeme text library
|
|
modify the last rule in the container. An end operation is added to the rule path.
|
|
position to the next possible valid sysmbol
|
|
process input source text using rulepath to determine allowed tokens
|
|
|
|
setup ActiveContexts - should be called by subclass to setup initial language contexts
Definition at line 405 of file OgreCompiler2Pass.h. References Ogre::uint. |
|
sets up the parser rules for the client based on the BNF Grammer text passed in. Raises an exception if the grammer did not compile successfully. This method gets called when a call to compile occurs and no compiled BNF grammer exists, otherwise nothing will happen since the compiler has no rules to work with. The grammer only needs to be set once during the lifetime of the compiler unless the grammer changes. BNF Grammer rules are cached once the BNF grammer source is compiled. The client should never have to call this method directly. |
|
setup client token definitions. Gets called when BNF grammer is being setup. Implemented in Ogre::CompositorScriptCompiler, and Ogre::MaterialScriptCompiler. |
|
comment specifiers are hard coded
|
|
find end of line marker and move past it
|
|
skip all the white space which includes spaces and tabs
|
|
If a next token instruction exist then test if its token ID matches. This method is usefull for peeking ahead during pass 2 to see if a certain token exists.
|
|
check if current position in source has the lexeme text equivalent to the TokenID
|
|
scan through all the rules and initialize token definition with index to rules for non-terminal tokens. Gets called when internal grammer is being verified or after client grammer has been parsed.
|
|
Active Contexts pattern used in pass 1 to determine which tokens are valid for a certain context.
Definition at line 255 of file OgreCompiler2Pass.h. |
|
the key of the active label being built during pass 1. a new key is calculated when mLabelIsActive switches from false to true Definition at line 246 of file OgreCompiler2Pass.h. |
|
Active token que, definitions, rules currntly being used by parser.
Definition at line 218 of file OgreCompiler2Pass.h. |
|
Definition at line 447 of file OgreCompiler2Pass.h. |
|
current line number in source being tokenized
Definition at line 233 of file OgreCompiler2Pass.h. |
|
Definition at line 215 of file OgreCompiler2Pass.h. |
|
Definition at line 450 of file OgreCompiler2Pass.h. |
|
storage container for constants defined in source container uses Token index as a key associated with a float constant
Definition at line 237 of file OgreCompiler2Pass.h. |
|
Definition at line 232 of file OgreCompiler2Pass.h. |
|
Definition at line 230 of file OgreCompiler2Pass.h. |
|
flag indicates when a label is being parsed. It gets set false when a terminal token not of _character_ is encountered Definition at line 243 of file OgreCompiler2Pass.h. |
|
storage container for string labels defined in source container uses Token index as a key associated with a label
Definition at line 240 of file OgreCompiler2Pass.h. |
|
flag being true indicates that spaces are not to be skipped automatically gets set to false when mLabelIsActive goes to false
Definition at line 249 of file OgreCompiler2Pass.h. |
|
if flag is true then next terminal token is not added to token que if found but does effect rule path flow
Definition at line 252 of file OgreCompiler2Pass.h. |
|
the location within the token instruction container where pass 2 is
Definition at line 220 of file OgreCompiler2Pass.h. |
|
the que position of the previous token that had an action. A token's action is fired on the next token having an action. Definition at line 224 of file OgreCompiler2Pass.h. |
|
pointer to the source to be compiled
Definition at line 227 of file OgreCompiler2Pass.h. |
|
name of the source to be compiled
Definition at line 229 of file OgreCompiler2Pass.h. |
|
Definition at line 138 of file OgreCompiler2Pass.h. |
Copyright © 2000-2005 by The OGRE Team
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Mar 12 14:38:25 2006