Go to the first, previous, next, last section, table of contents.


Methods

We already know how to use {} to include literal TOM code in a rule. When you want to add code to the parser class outside of a rule, things are different. Since such code can only be a method, such methods can be added as an extension to the parser class, using another source file. However, this is not all that convenient, and extending a class within the same unit is not considered to be elegant.

gp provides the compound %%...%% construct to define methods. At any top-level location in the grammar, such a compound may be used to declare or define methods. Before the %instance has been seen, any method defined is a class method. After the %instance, the method is an instance method.

Example `ex7' starts with a class method void note int.

%class ex7

%%
<doc> Print the {tok}.  This is a class method.  </doc>
void
  note int tok
{
  [[[stdio out] print ("next token: ", byte (tok))] nl];
}
%%

Although the instance definition can remain empty, a %instance is needed to indicate that the next method definition between %%...%% is an instance method.

%instance

%%
<doc> Pass to the same method of our class.  </doc>
void
  note int tok
{
  [isa note tok];
}
%%

The grammar itself is rather silly, but demonstrates that the method that we defined can be invoked. The token argument is an instance variable of the gps.Parser class; it holds the current token.

language: expr*;
expr:
                {
                  [self note token];
                }
        [ '(' expr* ')'
        | '[' expr* ']'
        | '{' expr* '}'
        ]
        ;


Go to the first, previous, next, last section, table of contents.