|
Transitional actions |
Top Previous Next |
|
Scripts > Productions > Actions > Transitional action
Besides the semantic actions there also is a type of very special "syntactic" actions. A transitional action is executed after a token was accepted and before the next is recognized. This is the ideal time to insert of new dynamic tokens with AddToken, since the new token is then already available before the determination of the next token Transitional actions are necessary too, to assure that a production behaves just the same at its use for look-ahead in the text as normally. A divergent behavior can arise if during parsing new dynamic tokens are produced or if the text scope is changed. If such a change is executed as a transition action, it is executed also during the foresight temporarily. But the set of the dynamic tokens and the text scope will remain the same before and after the look-ahead.
As transitional actions primarily are considered the functions: AddToken, PushScope and PopScope. As transitional actions they are executed, if they are appended to the expression for a token in conjunction with a dot.
Examples:
ID.AddToken(xState.str(), "CLASS") ID[n].AddToken(xState.str(), "CLASS") ID[n].AddToken(xState.str(), "CLASS", "NewScope").PushScope("NewScope");
It isn't possible to define a transitional action for a token, if a "normal" action is also assigned to it.
An interesting application is the recognition of constructors of c++ classes. Such constructors are indicated by an identifier followed by two colons and the same identifier again, e.g. CParser: . CParser. Normally the repeated identifier can easily be recognized by semantic code. However, such code isn't executed at a look-ahead. In this case you could defines a placeholder token "CLASS" and add the identifier to him during it's first recognition. The second occurrence is then recognized by the CLASS token.
IsScoped ::= ID "::" ID
IsClass ::= ID.AddToken(xState.str(), "CLASS") "::" CLASS
IF(IsScoped()) IF(IsClass()) ID.AddToken(xState.str(), "CLASS") "::" CLASS {{out << "class found"; }} ELSE ID "::" ID {{out << "member function found"; }} END ELSE ID {{out << "identifier found"; }} END
|
|
This page belongs to the TextTransformer Documentation |
Home Content German |