










Sig: Renombrando los resultados de
Sup: Análisis Sintáctico con Regexp::Grammars
Ant: Introducción
Err: Si hallas una errata ...
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 a trasnlate() method
for each of the classes, and have every node call that method on each
of its children. The chain of translate() calls would cascade down the
nodes of the tree, each one invoking the appropriate translate() method
according to the type of node encountered.
The only problem is that, by default, Regexp::Grammars
returns a tree
of plain-old hashes, not Class::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.











Sig: Renombrando los resultados de
Sup: Análisis Sintáctico con Regexp::Grammars
Ant: Introducción
Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22