When a grammar has parsed successfully, the %/
variable will contain
a series of nested hashes (and possibly arrays) representing the
hierarchical structure of the parsed data.
Typically, the next step is to walk that tree, extracting or converting or otherwise processing that information. If the tree has nodes of many different types, it can be difficult to build a recursive subroutine that can navigate it easily.
A much cleaner solution is possible if the nodes of the tree are proper objects. In that case, you just define atrasnlate()
method for each of the classes, and have every node call that method on each of its children. The chain oftranslate()
calls would cascade down the nodes of the tree, each one invoking the appropriatetranslate()
method according to the type of node encountered.
The only problem is that, by default, Regexp::Grammars returns a tree of plain-old hashes, notClass::Whatever
objects. Fortunately, it's easy to request that the result hashes be automatically blessed into the appropriate classes, using the<objrule:...>
and<objtoken:...>
directives.
These directives are identical to the<rule:...>
and<token:...>
directives (respectively), except that the rule or token they create will also bless the hash it normally returns, converting it to an object of a class whose name is the same as the rule or token itself.
For example:
<objrule: Element> # ...Defines a rule that can be called as <Element> # ...and which returns a hash-based Element object
The IDENTIFIER
of the rule or token may also be fully qualified. In
such cases, the rule or token is defined using only the final short
name, but the result object is blessed using the fully qualified long
name. For example:
<objrule: LaTeX::Element> # ...Defines a rule that can be called as <Element> # ...and which returns a hash-based LaTeX::Element object
This can be useful to ensure that returned objects don't collide with other namespaces in your program.
Note that you can freely mix object-returning and plain-old-hash-returning rules and tokens within a single grammar, though you have to be careful not to subsequently try to call a method on any of the unblessed nodes.