A Scala library for language processing.
Documentation HomeUp: Context, Prev: Collections
IMPORTANT NOTE: This page describes Kiama 1.x. Much of it also applies to Kiama 2.x, but not all. Please consult the 2.x release notes for the main differences. We are currently writing comprehensive documentation for 2.x that will eventually replace these pages.
Any Scala reference value can have attributes defined for it using Kiama.
Rewriting is more problematic because Kiama needs to have access to
the components of a value in order to be able to rewrite it in a
generic fashion. Kiama has built-in support for rewriting of Product
values (see Case Classes), and GenTraversable or Map collections
(see Collections), since the Scala library provides mechanisms for
accessing their components.
You can make other types of value rewritable by having them implement
Kiama’s Rewritable trait.
trait Rewritable {
import Rewriter.Term
def arity : Int
def deconstruct : Seq[Term]
def reconstruct (components : Array[Term]) : Term
protected def illegalArgs (desc : String, argtypes : String, args : Array[Term])
}
(Rewriter.Term is Any in the current version of Kiama.)
A Rewritable value must provide a way of deconstructing itself using
the arity method, that returns the number of children that the value
has, and the deconstruct method, that returns a sequence of those
children.
The reconstruct method is used to build a new value that is the same
as the receiver, except that its children are replaced by those in the
components array. If reconstruct cannot accept the components
for some reason (e.g., wrong number or type), the illegalArgs method
should be called. By default, illegalArgs throws an illegalArgumentException.
See Kiama’s imperative example (file
ASTNonCase.scala)
for an example of how to define Rewritable instances.
Up: Context, Prev: Case Classes