JAPE Shorthands
Contents
1. Copy a feature value from the LHS to RHS
Rule: Rule1
(
{Lookup.majorType == "location"}
):look
-->
:look.Location = { kind = :look.Lookup.minorType }
This only works if you know that there is only one annotation of type Lookup in the look binding.
2. Use matched annotations in a Java RHS
This:
Rule: Rule2
(
{Token}*
):tok
-->
:tok{
// some Java code here
}
is equivalent to this:
Rule: Rule2
(
{Token}*
):tok
-->
{
AnnotationSet tokAnnots = (AnnotationSet)bindings.get("tok");
if(tokAnnots != null && tokAnnots.size() != 0) {
// some Java code here
}
}
i.e. you can use tokAnnots in your Java code, and you can be sure that it isn't empty when you use it.
3. Using optional annotations
Rule: MeasureSpan
/*
* Matches loosely an interval.
*/
({Token.kind == "word"})?:before
(
({Number}):amount1
((UNIT):unit1({Token.string == "."})?
)?
({Token.string == "-"}
|{Token.string == "±"}
|({Token.string == "+"}{Token.string == "/"}{Token.string == "-"})
):conj
({Number}):amount2
(UNIT)?:unit2
):span
-->
:amount1.Measurement = { type = "scalarValue"},
:unit1.Measurement = { type = "unit"},
:amount2.Measurement = { type = "scalarValue"},
:unit2.Measurement = { type = "unit"},
:span.Measurement = { type = "interval",
conj = :conj.Token.string,
before = :before.Token.string }
Warning: in the case of ':conj.Token.string' you get only one of the matched Tokens, and can't guarantee which one. This shorthand is best reserved for cases where you know the binding contains only one annotation.




