You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2015/11/13 19:09:28 UTC

svn commit: r1714245 - in /uima/ruta/branches/UIMA-4408/ruta-core/src/main: antlr3/org/apache/uima/ruta/parser/ java/org/apache/uima/ruta/ java/org/apache/uima/ruta/action/ java/org/apache/uima/ruta/condition/ java/org/apache/uima/ruta/expression/ java...

Author: pkluegl
Date: Fri Nov 13 18:09:27 2015
New Revision: 1714245

URL: http://svn.apache.org/viewvc?rev=1714245&view=rev
Log:
UIMA-4408 + UIMA-4683
- towards general annotation expression handling in ruta

Added:
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java   (with props)
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java   (with props)
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java   (with props)
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java   (with props)
Modified:
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java
    uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Fri Nov 13 18:09:27 2015
@@ -399,6 +399,9 @@ public void setExternalFactory(RutaExter
       	private boolean isTypeFunctionExtension(String name) {
       	  return external.getTypeFunctionExtensions().keySet().contains(name);
       	}
+      	private boolean isAnnotationFunctionExtension(String name) {
+      	  return external.getAnnotationFunctionExtensions().keySet().contains(name);
+      	}
       	private boolean isBlockExtension(String name) {
       	  return external.getBlockExtensions().keySet().contains(name);
       	}
@@ -1148,16 +1151,16 @@ typeMatchExpression returns [IRutaExpres
 options {
 	backtrack = true;
 }
-	:
-	(typeFunction)=> tf = typeFunction {expr = tf;}
+	:	
+	(featureMatchExpression)=> fme = featureMatchExpression {expr = fme;}
 	|
-	(matchReference)=> mr = matchReference {expr = mr;}
+	(typeExpression)=> te = typeExpression {expr = te;}
 	;
 
 matchReference returns [MatchReference mr = null]
 	:
-	ref = dottedId ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = argument)?
-	{mr = ExpressionFactory.createMatchReference(ref, comp, arg);}
+	ref = dottedId 
+	{mr = ExpressionFactory.createMatchReference(ref);}
 	;
 
 typeExpression returns [TypeExpression type = null]
@@ -1196,6 +1199,13 @@ simpleTypeExpression returns [TypeExpres
 	{type = ExpressionFactory.createSimpleTypeExpression(at, $blockDeclaration::env);}
 	;
 
+
+matchExpression returns [FeatureExpression feat = null]
+	:
+	match = dottedId
+	{MatchReference mr = ExpressionFactory.createMatchReference(match);}
+	;
+
 featureExpression returns [FeatureExpression feat = null]
 @init{
 List<Token> fs = new ArrayList<Token>();
@@ -1204,25 +1214,30 @@ TypeExpression te = null;
 	:
 	match = dottedId2 
 	{
-	MatchReference mr = ExpressionFactory.createMatchReference(match, null, null);
+	MatchReference mr = ExpressionFactory.createMatchReference(match);
 	feat = ExpressionFactory.createFeatureExpression(mr, $blockDeclaration::env);
 	}
 	;
 
-featureMatchExpression returns [FeatureMatchExpression fme = null]
+featureMatchExpression returns [FeatureExpression fme = null]
 	:
 	match = dottedId2 ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = argument)?
 	{
-	MatchReference mr = ExpressionFactory.createMatchReference(match, comp, arg);
-	fme = ExpressionFactory.createFeatureMatchExpression(mr, $blockDeclaration::env);}
+	MatchReference mr = ExpressionFactory.createMatchReference(match);
+	if(comp != null) {
+	fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env);
+	} else {
+	fme = ExpressionFactory.createFeatureExpression(mr, $blockDeclaration::env);
+	}
+	}
 	;
 
 featureMatchExpression2 returns [FeatureMatchExpression fme = null]
 	:
 	match = dottedId2 (comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = argument
 	{
-	MatchReference mr = ExpressionFactory.createMatchReference(match, comp, arg);
-	fme = ExpressionFactory.createFeatureMatchExpression(mr, $blockDeclaration::env);}
+	MatchReference mr = ExpressionFactory.createMatchReference(match);
+	fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env);}
 	;
 
 
@@ -1230,8 +1245,8 @@ featureAssignmentExpression returns [Fea
 	:
 	match = dottedId2 op = ASSIGN_EQUAL arg = argument
 	{
-	MatchReference mr = ExpressionFactory.createMatchReference(match, op, arg);
-	fme = ExpressionFactory.createFeatureMatchExpression(mr, $blockDeclaration::env);
+	MatchReference mr = ExpressionFactory.createMatchReference(match);
+	fme = ExpressionFactory.createFeatureMatchExpression(mr, op, arg, $blockDeclaration::env);
 	}
 	;
 	
@@ -2179,7 +2194,14 @@ options {
 
 annotationOrTypeExpression returns [IRutaExpression expr = null]
 	:
-	a1 = typeExpression {expr = a1;}
+	aae = annotationAddressExpression {expr = aae;}
+	|
+	tf = typeFunction {expr = tf;}
+	|
+	af = annotationFunction {expr = af;}	
+	|
+	ref = dottedId
+	{expr = ExpressionFactory.createGenericExpression(ref);}
 	;
 
 annotationExpression returns [IRutaExpression expr = null]
@@ -2206,6 +2228,21 @@ annotationLabelExpression returns [IRuta
 	label = Identifier {expr = ExpressionFactory.createAnnotationLabelExpression(label);}
 	;
 
+annotationFunction returns [IAnnotationExpression expr = null]
+	:
+	(e = externalAnnotationFunction)=> e = externalAnnotationFunction {expr = e;}
+	;
+
+externalAnnotationFunction returns [IAnnotationExpression expr = null]
+	:
+	{isAnnotationFunctionExtension(input.LT(1).getText())}? 
+	id = Identifier LPAREN
+	args = varArgumentList?	RPAREN
+	{
+		expr = external.createExternalAnnotationFunction(id, args);
+	}
+	;
+
 nullExpression returns [IRutaExpression expr = null]
 	:
 	NULL {expr = ExpressionFactory.createNullExpression();}

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java Fri Nov 13 18:09:27 2015
@@ -29,13 +29,12 @@ import org.apache.uima.UimaContext;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
 import org.apache.uima.ruta.expression.IRutaExpression;
-import org.apache.uima.ruta.expression.MatchReference;
 import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
+import org.apache.uima.ruta.expression.feature.FeatureExpression;
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
 import org.apache.uima.ruta.rule.AbstractRuleElement;
 import org.apache.uima.ruta.rule.ComposedRuleElement;
 import org.apache.uima.ruta.rule.ConjunctRulesRuleElement;
@@ -105,8 +104,8 @@ public class RutaScriptFactory {
     RutaScriptBlock result = createScriptBlock(module, null, null, null, defaultNamespace);
     List<RuleElement> ruleElements = new ArrayList<RuleElement>();
     RuleElementIsolator container = new RuleElementIsolator();
-    ruleElements.add(createRuleElement(new MatchReference("uima.tcas.DocumentAnnotation", null,
-            null), null, null, null, container, result));
+    ruleElements.add(createRuleElement(new SimpleTypeExpression("uima.tcas.DocumentAnnotation"), null,
+            null, null, container, result));
     RutaRule createRule = createRule(ruleElements, result);
     container.setContainer(createRule);
 
@@ -140,16 +139,16 @@ public class RutaScriptFactory {
           RuleElementQuantifier quantifier, List<AbstractRutaCondition> conditions,
           List<AbstractRutaAction> actions, RuleElementContainer container, RutaBlock parent) {
     RutaMatcher matcher = null;
-    if (expression instanceof MatchReference) {
-      matcher = new RutaTypeMatcher((MatchReference) expression);
-    } else if (expression instanceof ITypeExpression) {
-      // e.g., for functions
-      MatchReference matchReference = new MatchReference((TypeExpression) expression);
-      matcher = new RutaTypeMatcher(matchReference);
+    if (expression instanceof ITypeExpression) {
+      matcher = new RutaTypeMatcher((ITypeExpression) expression);
+    } else if (expression instanceof FeatureExpression) {
+      matcher = new RutaTypeMatcher((FeatureExpression) expression);
     } else if (expression instanceof IAnnotationExpression) {
-      matcher = new RutaAnnotationMatcher((IAnnotationExpression)expression);
+      matcher = new RutaAnnotationMatcher((IAnnotationExpression) expression);
     } else if (expression instanceof IStringExpression) {
       matcher = new RutaLiteralMatcher((IStringExpression) expression);
+    } else {
+      throw new RuntimeException(expression.getClass().getSimpleName() + " is not a valid expression for a matching condition.");
     }
     return new RutaRuleElement(matcher, quantifier, conditions, actions, container, parent);
   }

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Fri Nov 13 18:09:27 2015
@@ -54,7 +54,6 @@ import org.apache.uima.ruta.expression.f
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
 import org.apache.uima.ruta.rule.AbstractRule;
 import org.apache.uima.ruta.rule.AbstractRuleMatch;
 import org.apache.uima.ruta.rule.MatchContext;
@@ -970,7 +969,7 @@ public class RutaStream extends FSIterat
       }
     } else if (value instanceof GenericFeatureExpression && !feature.getRange().isPrimitive()) {
       FeatureExpression fe = ((GenericFeatureExpression) value).getFeatureExpression();
-      TypeExpression typeExpr = fe.getTypeExpr(context, this);
+      ITypeExpression typeExpr = fe.getTypeExpr(context, this);
       Type t = typeExpr.getType(context, this);
       List<AnnotationFS> inWindow = this.getAnnotationsInWindow(context.getAnnotation(), t);
       if (fe instanceof SimpleFeatureExpression) {

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java Fri Nov 13 18:09:27 2015
@@ -40,6 +40,7 @@ import org.apache.uima.ruta.expression.f
 import org.apache.uima.ruta.expression.feature.GenericFeatureExpression;
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.expression.type.TypeExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 import org.apache.uima.ruta.utils.UIMAUtils;
@@ -80,7 +81,7 @@ public abstract class AbstractStructureA
         } else if (valueObject instanceof GenericFeatureExpression && !range.isPrimitive()) {
           GenericFeatureExpression gfe = (GenericFeatureExpression) valueObject;
           FeatureExpression fe = gfe.getFeatureExpression();
-          TypeExpression type = fe.getTypeExpr(context, stream);
+          ITypeExpression type = fe.getTypeExpr(context, stream);
           List<AnnotationFS> annotationsInWindow = stream.getAnnotationsInWindow(matchedAnnotation,
                   type.getType(context, stream));
           List<AnnotationFS> featureAnnotations = annotationsInWindow;

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java Fri Nov 13 18:09:27 2015
@@ -33,7 +33,7 @@ import org.apache.uima.cas.text.Annotati
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.rule.AnnotationComparator;
 import org.apache.uima.ruta.rule.MatchContext;
 import org.apache.uima.ruta.rule.RuleElement;
@@ -55,7 +55,7 @@ public class ImplicitFeatureAction exten
   public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
     RuleMatch match = context.getRuleMatch();
     RuleElement element = context.getElement();
-    TypeExpression typeExpr = expr.getTypeExpr(context, stream);
+    ITypeExpression typeExpr = expr.getTypeExpr(context, stream);
     Type type = typeExpr.getType(context, stream);
     List<AnnotationFS> matchedAnnotations = match.getMatchedAnnotationsOfElement(element);
     Collection<AnnotationFS> annotations = new TreeSet<AnnotationFS>(comp);

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java Fri Nov 13 18:09:27 2015
@@ -32,7 +32,6 @@ import org.apache.uima.ruta.expression.f
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 import org.apache.uima.ruta.rule.RuleElement;
 import org.apache.uima.ruta.rule.RuleMatch;
@@ -118,7 +117,7 @@ public class SetFeatureAction extends Ab
             }
           }
         } else if (expr instanceof GenericFeatureExpression) {
-          TypeExpression typeExpr = ((GenericFeatureExpression) expr).getFeatureExpression()
+          ITypeExpression typeExpr = ((GenericFeatureExpression) expr).getFeatureExpression()
                   .getTypeExpr(context, stream);
           Type t = typeExpr.getType(context, stream);
           List<AnnotationFS> inWindow = stream.getAnnotationsInWindow(annotationFS, t);

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java Fri Nov 13 18:09:27 2015
@@ -23,7 +23,6 @@ import org.apache.uima.cas.text.Annotati
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.MatchReference;
-import org.apache.uima.ruta.expression.feature.FeatureExpression;
 import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.rule.EvaluatedCondition;
@@ -48,14 +47,10 @@ public class FeatureCondition extends Ab
 
     String typeWithFeature = annotation.getType().getName() + "."
             + featureStringExpression.getStringValue(context, stream);
-    MatchReference mf = new MatchReference(typeWithFeature, "==", argExpr);
-    FeatureExpression featureExpression = mf.getFeatureExpression(context, stream);
-    if (featureExpression instanceof FeatureMatchExpression) {
-      FeatureMatchExpression fme = (FeatureMatchExpression) featureExpression;
-      boolean checkFeatureValue = fme.checkFeatureValue(annotation, context, stream);
-      return new EvaluatedCondition(this, checkFeatureValue);
-    }
-    return new EvaluatedCondition(this, false);
+    MatchReference mf = new MatchReference(typeWithFeature);
+    FeatureMatchExpression fme = new FeatureMatchExpression(mf, "==", argExpr, context.getParent());
+    boolean checkFeatureValue = fme.checkFeatureValue(annotation, context, stream);
+    return new EvaluatedCondition(this, checkFeatureValue);
   }
 
   public IStringExpression getFeatureStringExpression() {

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java Fri Nov 13 18:09:27 2015
@@ -31,7 +31,7 @@ import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
 import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.rule.EvaluatedCondition;
 import org.apache.uima.ruta.rule.MatchContext;
 import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -53,7 +53,7 @@ public class ImplicitCondition extends A
       return new EvaluatedCondition(this, be.getBooleanValue(context, stream));
     } else if (expr instanceof FeatureMatchExpression) {
       FeatureMatchExpression fme = (FeatureMatchExpression) expr;
-      TypeExpression typeExpr = fme.getTypeExpr(context, stream);
+      ITypeExpression typeExpr = fme.getTypeExpr(context, stream);
       Type type = typeExpr.getType(context, stream);
       List<AnnotationFS> annotations = getAnnotationsToCheck(annotation, type, fme, stream);
       Collection<AnnotationFS> featureAnnotations = fme.getFeatureAnnotations(annotations, stream,

Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.expression;
+
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
+import org.apache.uima.ruta.rule.MatchContext;
+
+public class AnnotationTypeExpression extends RutaExpression implements ITypeExpression, IAnnotationExpression {
+ 
+  
+  private MatchReference reference;
+  
+  private ITypeExpression typeExpression;
+  
+  private IAnnotationExpression annotationExpression;
+
+  private boolean initialized = false;
+  
+  public AnnotationTypeExpression(MatchReference reference) {
+    super();
+    this.reference = reference;
+  }
+
+  private void initialize(MatchContext context, RutaStream stream) {
+    annotationExpression = reference.getAnnotationExpression(context, stream);
+    typeExpression = reference.getTypeExpression(context, stream);
+    initialized = true;
+  }
+  
+  
+  @Override
+  public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
+    if (!initialized) {
+      initialize(context, stream);
+    }
+    return annotationExpression.getAnnotation(context, stream);
+  }
+
+  @Override
+  public Type getType(MatchContext context, RutaStream stream) {
+    if (!initialized) {
+      initialize(context, stream);
+    }
+    if(typeExpression != null) {
+      return typeExpression.getType(context, stream);
+    } else {
+      return getAnnotation(context, stream).getType();
+    }
+  }
+
+  @Override
+  public String getStringValue(MatchContext context, RutaStream stream) {
+    if (!initialized) {
+      initialize(context, stream);
+    }
+    if(annotationExpression != null) {
+      return annotationExpression.getStringValue(context, stream);
+    } else {
+      return typeExpression.getStringValue(context, stream);
+    }
+  }
+
+  
+  
+  
+}

Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java Fri Nov 13 18:09:27 2015
@@ -25,6 +25,7 @@ import java.util.List;
 import org.antlr.runtime.Token;
 import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.expression.annotation.AnnotationAddressExpression;
+import org.apache.uima.ruta.expression.annotation.AnnotationFeatureExpression;
 import org.apache.uima.ruta.expression.annotation.AnnotationLabelExpression;
 import org.apache.uima.ruta.expression.annotation.AnnotationVariableExpression;
 import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
@@ -250,18 +251,18 @@ public class ExpressionFactory {
     return new SimpleFeatureExpression(mr);
   }
 
-  public static FeatureMatchExpression createFeatureMatchExpression(MatchReference mr, RutaBlock env) {
-    return new FeatureMatchExpression(mr, env);
+  public static FeatureMatchExpression createFeatureMatchExpression(MatchReference mr, Token opToken,
+          IRutaExpression arg, RutaBlock env) {
+    String op = "";
+    if(opToken != null) {
+      op = opToken.getText();
+    }
+    return new FeatureMatchExpression(mr, op, arg, env);
   }
 
-  public static MatchReference createMatchReference(Token refToken, Token opToken,
-          IRutaExpression arg) {
+  public static MatchReference createMatchReference(Token refToken) {
     String match = refToken.getText();
-    String op = null;
-    if (opToken != null) {
-      op = opToken.getText();
-    }
-    return new MatchReference(match, op, arg);
+    return new MatchReference(match);
   }
 
   public static INumberExpression createNumberFeatureExpression(FeatureExpression fe) {
@@ -314,4 +315,14 @@ public class ExpressionFactory {
     return null;
   }
 
+  public static IAnnotationExpression createAnnotationFeatureExpression(
+          FeatureExpression featureExpression) {
+    return new AnnotationFeatureExpression(featureExpression);
+  }
+
+  public static IRutaExpression createGenericExpression(Token ref) {
+    MatchReference match = new MatchReference(ref.getText());
+    return new AnnotationTypeExpression(match);
+  }
+
 }

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java Fri Nov 13 18:09:27 2015
@@ -25,47 +25,45 @@ import java.util.List;
 import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.RutaEnvironment;
 import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.annotation.AnnotationLabelExpression;
+import org.apache.uima.ruta.expression.annotation.AnnotationVariableExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
 import org.apache.uima.ruta.expression.feature.FeatureExpression;
-import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
 import org.apache.uima.ruta.expression.feature.SimpleFeatureExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
 import org.apache.uima.ruta.expression.type.TypeVariableExpression;
 import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.rule.RuleElement;
+import org.apache.uima.ruta.rule.RuleMatch;
 
 public class MatchReference extends RutaExpression {
 
-  private String match;
+  private String reference;
 
-  private String op;
-
-  private IRutaExpression arg;
-
-  private TypeExpression typeExpression;
+  private ITypeExpression typeExpression;
+  
+  private IAnnotationExpression annotationExpression;
 
   private FeatureExpression featureExpression;
 
-  public MatchReference(String match, String op, IRutaExpression arg) {
-    super();
-    this.match = match;
-    this.op = op;
-    this.arg = arg;
-  }
-
-  public MatchReference(TypeExpression expression) {
+  private boolean initialized = false;
+  
+  public MatchReference(String reference) {
     super();
-    this.typeExpression = expression;
+    this.reference = reference;
   }
 
   private void resolve(MatchContext context, RutaStream stream) {
-    if (typeExpression != null) {
+    if (initialized) {
       return;
     }
     RutaBlock parent = context.getParent();
     RutaEnvironment e = parent.getEnvironment();
-    typeExpression = buildTypeExpression(match, e);
-    if (typeExpression == null) {
-      String[] elements = match.split("[.]");
+    
+    boolean success = buildTypeOrAnnotationExpression(reference, e, context, stream);
+    if (!success) {
+      String[] elements = reference.split("[.]");
       StringBuilder sb = new StringBuilder();
       List<String> tail = null;
       int counter = 0;
@@ -75,75 +73,65 @@ public class MatchReference extends Ruta
         }
         sb.append(eachPart);
         String head = sb.toString();
-        typeExpression = buildTypeExpression(head, e);
-        if (typeExpression != null) {
+        success = buildTypeOrAnnotationExpression(head, e, context, stream);
+        if (success) {
           tail = Arrays.asList(elements).subList(counter + 1, elements.length);
           break;
         }
         counter++;
       }
       if (tail != null) {
-        if (op == null) {
           featureExpression = new SimpleFeatureExpression(typeExpression, tail);
-        } else {
-          SimpleFeatureExpression expr = new SimpleFeatureExpression(typeExpression, tail);
-          featureExpression = new FeatureMatchExpression(expr, op, arg, parent);
-        }
       }
     }
-    if (typeExpression == null || typeExpression.getType(context, stream) == null) {
-      throw new IllegalArgumentException("Not able to resolve type of expression: " + match);
+    initialized = true;
+    if (typeExpression == null && annotationExpression == null) {
+      throw new IllegalArgumentException("Not able to resolve annotation/type expression: " + reference);
     }
   }
-
-  private TypeExpression buildTypeExpression(String candidate, RutaEnvironment e) {
+  
+  private boolean buildTypeOrAnnotationExpression(String candidate, RutaEnvironment e, MatchContext context, RutaStream stream) {
     if (e.isVariableOfType(candidate, "TYPE")) {
-      return new TypeVariableExpression(candidate);
+      typeExpression = new TypeVariableExpression(candidate);
+      return true;
+    } else if (e.isVariableOfType(candidate, "ANNOTATION")) {
+      annotationExpression = new AnnotationVariableExpression(candidate);
+      return true;
     } else if (e.getType(candidate) != null) {
-      return new SimpleTypeExpression(candidate);
+      typeExpression = new SimpleTypeExpression(candidate);
+      return true;
+    } else if (context.getRuleMatch() != null) {
+      RuleMatch ruleMatch = context.getRuleMatch();
+      RuleElement ruleElementWithLabel = ruleMatch.getRule().getRuleElementWithLabel(candidate);
+      if(ruleElementWithLabel != null) {
+        annotationExpression = new AnnotationLabelExpression(candidate);
+        return true;
+      }
     }
-    return null;
+    return false;
   }
 
-  public TypeExpression getTypeExpression(MatchContext context, RutaStream stream) {
+  public ITypeExpression getTypeExpression(MatchContext context, RutaStream stream) {
     resolve(context, stream);
     return typeExpression;
   }
-
-  public FeatureExpression getFeatureExpression(MatchContext context, RutaStream stream) {
+  
+  public IAnnotationExpression getAnnotationExpression(MatchContext context, RutaStream stream) {
     resolve(context, stream);
-    return featureExpression;
+    return annotationExpression;
   }
 
-  public String getOp() {
-    return op;
-  }
-
-  public IRutaExpression getArg() {
-    return arg;
-  }
-
-  public RutaExpression getRawTypeExpression() {
-    return typeExpression;
-  }
-
-  public RutaExpression getRawFeatureExpression() {
+  public FeatureExpression getFeatureExpression(MatchContext context, RutaStream stream) {
+    resolve(context, stream);
     return featureExpression;
   }
 
   public String toString() {
-    String tail = "";
-    if (op != null) {
-      tail += op;
-    }
-    if (arg != null) {
-      tail += arg.toString();
-    }
-    return match + tail;
+    return reference;
   }
 
   public String getMatch() {
-    return match;
+    return reference;
   }
 
 }

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java Fri Nov 13 18:09:27 2015
@@ -21,14 +21,19 @@ package org.apache.uima.ruta.expression.
 
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.RutaExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
-public abstract class AbstractAnnotationExpression implements IAnnotationExpression {
+public abstract class AbstractAnnotationExpression extends RutaExpression implements IAnnotationExpression {
 
   @Override
   public String getStringValue(MatchContext context, RutaStream stream) {
     AnnotationFS annotation = getAnnotation(context, stream);
-    return annotation.getCoveredText();
+    if(annotation != null) {
+      return annotation.getCoveredText();
+    } else {
+      return "null";
+    }
   }
   
 }

Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.expression.annotation;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.uima.cas.Feature;
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.feature.FeatureExpression;
+import org.apache.uima.ruta.rule.MatchContext;
+
+/**
+ * An expression referring to an annotation stored in a feature.
+ *
+ */
+public class AnnotationFeatureExpression extends AbstractAnnotationExpression {
+
+  private FeatureExpression fe;
+
+  public AnnotationFeatureExpression(FeatureExpression fe) {
+    super();
+    this.fe = fe;
+  }
+  
+  @Override
+  public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
+    AnnotationFS annotation = context.getAnnotation();
+    Type type = fe.getTypeExpr(context, stream).getType(context, stream);
+    Feature feature = fe.getFeature(context, stream);
+    List<AnnotationFS> list = getTargetAnnotation(annotation, type, stream);
+    Collection<AnnotationFS> featureAnnotations = fe.getFeatureAnnotations(list, stream, context,
+            false);
+    if (!featureAnnotations.isEmpty()) {
+      AnnotationFS next = featureAnnotations.iterator().next();
+      FeatureStructure featureValue = next.getFeatureValue(feature);
+      if(featureValue instanceof AnnotationFS) {
+        return (AnnotationFS) featureValue;
+      }
+    }
+    return null;
+  }
+
+
+  public FeatureExpression getFeatureExpression() {
+    return fe;
+  }
+
+  public void setFeatureExpression(FeatureExpression fe) {
+    this.fe = fe;
+  }
+
+  
+
+}

Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.expression.annotation;
+
+public abstract class AnnotationFunctionExpression extends AbstractAnnotationExpression {
+
+}

Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -26,7 +26,7 @@ import org.apache.uima.cas.Feature;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.RutaExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
 public abstract class FeatureExpression extends RutaExpression {
@@ -37,7 +37,7 @@ public abstract class FeatureExpression
 
   public abstract List<String> getFeatureStringList(MatchContext context, RutaStream stream);
 
-  public abstract TypeExpression getTypeExpr(MatchContext context, RutaStream stream);
+  public abstract ITypeExpression getTypeExpr(MatchContext context, RutaStream stream);
 
   public abstract Collection<AnnotationFS> getFeatureAnnotations(
           Collection<AnnotationFS> annotations, RutaStream stream, MatchContext context,

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java Fri Nov 13 18:09:27 2015
@@ -47,23 +47,13 @@ public class FeatureMatchExpression exte
 
   private String op;
 
-  public FeatureMatchExpression(FeatureExpression f, String op, IRutaExpression arg,
-          RutaBlock parent) {
-    // FIXME
-    super(f.getTypeExpr(new MatchContext(parent), null), f.getFeatureStringList(new MatchContext(
-            parent), null));
+  public FeatureMatchExpression(MatchReference mr, String op, IRutaExpression arg, RutaBlock env) {
+    super(mr);
     this.op = op;
     this.arg = arg;
   }
 
-  public FeatureMatchExpression(MatchReference mr, RutaBlock env) {
-    super(mr);
-  }
-
   public IRutaExpression getArg() {
-    if (getMatchReference() != null && arg == null) {
-      arg = getMatchReference().getArg();
-    }
     return arg;
   }
 
@@ -72,9 +62,6 @@ public class FeatureMatchExpression exte
   }
 
   public String getOp() {
-    if (getMatchReference() != null && op == null) {
-      op = getMatchReference().getOp();
-    }
     return op;
   }
 
@@ -191,4 +178,15 @@ public class FeatureMatchExpression exte
     return false;
   }
 
+  public String toString() {
+    String result = super.toString();
+    if(op != null) {
+      result += op;
+    }
+    if(arg != null) {
+      result += arg.toString();
+    }
+    return result;
+  }
+  
 }

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -19,16 +19,18 @@
 
 package org.apache.uima.ruta.expression.feature;
 
+import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.ExpressionFactory;
 import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
 public class GenericFeatureExpression extends RutaExpression implements INumberExpression,
-        IBooleanExpression, IStringExpression {
+        IBooleanExpression, IStringExpression, IAnnotationExpression {
 
   private FeatureExpression featureExpression;
 
@@ -37,6 +39,8 @@ public class GenericFeatureExpression ex
   private IStringExpression stringExpression;
 
   private IBooleanExpression booleanExpression;
+  
+  private IAnnotationExpression annotationExpression;
 
   public GenericFeatureExpression(FeatureExpression fe) {
     super();
@@ -83,6 +87,14 @@ public class GenericFeatureExpression ex
     return numberExpression.getFloatValue(context, stream);
   }
 
+  @Override
+  public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
+    if (annotationExpression == null) {
+      annotationExpression = ExpressionFactory.createAnnotationFeatureExpression(featureExpression);
+    }
+    return annotationExpression.getAnnotation(context, stream);
+  }
+
   public FeatureExpression getFeatureExpression() {
     return featureExpression;
   }
@@ -91,4 +103,5 @@ public class GenericFeatureExpression ex
     this.featureExpression = featureExpression;
   }
 
+
 }

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -34,6 +34,7 @@ import org.apache.uima.ruta.UIMAConstant
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.MatchReference;
 import org.apache.uima.ruta.expression.NullExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.expression.type.TypeExpression;
 import org.apache.uima.ruta.rule.AnnotationComparator;
 import org.apache.uima.ruta.rule.MatchContext;
@@ -42,13 +43,13 @@ public class SimpleFeatureExpression ext
 
   private MatchReference mr;
 
-  private TypeExpression typeExpr;
+  private ITypeExpression typeExpr;
 
   private List<String> features;
 
   protected AnnotationComparator comparator = new AnnotationComparator();
 
-  public SimpleFeatureExpression(TypeExpression te, List<String> featureReferences) {
+  public SimpleFeatureExpression(ITypeExpression te, List<String> featureReferences) {
     super();
     this.typeExpr = te;
     this.features = featureReferences;
@@ -102,7 +103,7 @@ public class SimpleFeatureExpression ext
     return result;
   }
 
-  public TypeExpression getTypeExpr(MatchContext context, RutaStream stream) {
+  public ITypeExpression getTypeExpr(MatchContext context, RutaStream stream) {
     if (mr != null) {
       return mr.getTypeExpression(context, stream);
     }
@@ -128,34 +129,37 @@ public class SimpleFeatureExpression ext
           RutaStream stream, MatchContext context, boolean checkOnFeatureValue) {
     Collection<AnnotationFS> result = new TreeSet<AnnotationFS>(comparator);
     List<Feature> features = getFeatures(context, stream);
+
     for (AnnotationFS eachBase : annotations) {
       AnnotationFS afs = eachBase;
-      for (Feature feature : features) {
-        if (afs == null) {
-          break;
-        }
-        if (feature == null || feature.getRange().isPrimitive()) {
-          // feature == null -> this is the coveredText "feature"
-          if (this instanceof FeatureMatchExpression) {
-            FeatureMatchExpression fme = (FeatureMatchExpression) this;
-            if (checkOnFeatureValue) {
-              if (fme.checkFeatureValue(afs, context, feature, stream)) {
+      if (features != null) {
+        for (Feature feature : features) {
+          if (afs == null) {
+            break;
+          }
+          if (feature == null || feature.getRange().isPrimitive()) {
+            // feature == null -> this is the coveredText "feature"
+            if (this instanceof FeatureMatchExpression) {
+              FeatureMatchExpression fme = (FeatureMatchExpression) this;
+              if (checkOnFeatureValue) {
+                if (fme.checkFeatureValue(afs, context, feature, stream)) {
+                  result.add(afs);
+                }
+              } else {
                 result.add(afs);
               }
+              break;
             } else {
               result.add(afs);
             }
-            break;
           } else {
-            result.add(afs);
-          }
-        } else {
-          FeatureStructure value = afs.getFeatureValue(feature);
-          if (value instanceof AnnotationFS) {
-            afs = (AnnotationFS) value;
-          } else if (value != null) {
-            throw new IllegalArgumentException(value.getType()
-                    + " is not supported in a feature match expression (" + mr.getMatch() + ").");
+            FeatureStructure value = afs.getFeatureValue(feature);
+            if (value instanceof AnnotationFS) {
+              afs = (AnnotationFS) value;
+            } else if (value != null) {
+              throw new IllegalArgumentException(value.getType()
+                      + " is not supported in a feature match expression (" + mr.getMatch() + ").");
+            }
           }
         }
       }
@@ -178,4 +182,8 @@ public class SimpleFeatureExpression ext
     return mr;
   }
 
+  public String toString() {
+    return mr.getMatch();
+  }
+
 }

Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.extensions;
+
+import java.util.List;
+
+import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.annotation.AnnotationFunctionExpression;
+
+public interface IRutaAnnotationFunctionExtension extends IRutaExtension {
+
+  AnnotationFunctionExpression createAnnotationFunction(String name, List<RutaExpression> args)
+          throws RutaParseException;
+
+}

Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java Fri Nov 13 18:09:27 2015
@@ -29,6 +29,7 @@ import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
 import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.string.AbstractStringExpression;
@@ -42,6 +43,8 @@ public class RutaExternalFactory {
 
   private Map<String, IRutaTypeFunctionExtension> typeFunctionExtensions;
 
+  private Map<String, IRutaAnnotationFunctionExtension> annotationFunctionExtensions;
+
   private Map<String, IRutaBooleanFunctionExtension> booleanFunctionExtensions;
 
   private Map<String, IRutaStringFunctionExtension> stringFunctionExtensions;
@@ -60,6 +63,7 @@ public class RutaExternalFactory {
     stringFunctionExtensions = new HashMap<String, IRutaStringFunctionExtension>();
     numberFunctionExtensions = new HashMap<String, IRutaNumberFunctionExtension>();
     typeFunctionExtensions = new HashMap<String, IRutaTypeFunctionExtension>();
+    annotationFunctionExtensions = new HashMap<String, IRutaAnnotationFunctionExtension>();
     blockExtensions = new HashMap<String, IRutaBlockExtension>();
   }
 
@@ -96,6 +100,17 @@ public class RutaExternalFactory {
     return null;
   }
 
+  public IAnnotationExpression createExternalAnnotationFunction(Token id, List<RutaExpression> args)
+          throws RutaParseException {
+    String name = id.getText();
+    IRutaAnnotationFunctionExtension extension = annotationFunctionExtensions.get(name);
+    if (extension != null) {
+      return extension.createAnnotationFunction(name, args);
+    }
+    // Throw exception
+    return null;
+  }
+
   public IBooleanExpression createExternalBooleanFunction(Token id, List<RutaExpression> args)
           throws RutaParseException {
     String name = id.getText();
@@ -232,6 +247,15 @@ public class RutaExternalFactory {
     this.typeFunctionExtensions = typeFunctionExtensions;
   }
 
+  public Map<String, IRutaAnnotationFunctionExtension> getAnnotationFunctionExtensions() {
+    return annotationFunctionExtensions;
+  }
+  
+  public void setAnnotationFunctionExtensions(
+          Map<String, IRutaAnnotationFunctionExtension> annotationFunctionExtensions) {
+    this.annotationFunctionExtensions = annotationFunctionExtensions;
+  }
+  
   public Map<String, IRutaActionExtension> getActionExtensions() {
     return actionExtensions;
   }
@@ -264,4 +288,6 @@ public class RutaExternalFactory {
     this.context = context;
   }
 
+ 
+
 }

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java Fri Nov 13 18:09:27 2015
@@ -29,7 +29,7 @@ import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
-import org.apache.uima.ruta.expression.MatchReference;
+import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.feature.FeatureExpression;
 import org.apache.uima.ruta.rule.quantifier.RuleElementQuantifier;
 import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -373,10 +373,8 @@ public class RutaRuleElement extends Abs
     boolean base = true;
     if (matcher instanceof RutaTypeMatcher) {
       RutaTypeMatcher rtm = (RutaTypeMatcher) matcher;
-      MatchReference mr = (MatchReference) rtm.getExpression();
-      MatchContext context = new MatchContext(this, ruleMatch, after);
-      FeatureExpression featureExpression = mr.getFeatureExpression(context, stream);
-      if (featureExpression != null) {
+      IRutaExpression expression = rtm.getExpression();
+      if (expression instanceof FeatureExpression) {
         base = matcher.match(annotation, stream, getParent());
       }
     }

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java Fri Nov 13 18:09:27 2015
@@ -31,24 +31,31 @@ import org.apache.uima.cas.TypeSystem;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.RutaStream;
-import org.apache.uima.ruta.expression.MatchReference;
-import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.feature.FeatureExpression;
 import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.type.RutaBasic;
 
 public class RutaTypeMatcher implements RutaMatcher {
 
   private static final boolean CHECK_ON_FEATURE = false;
 
-  protected final MatchReference mr;
+  private ITypeExpression typeExpression;
+
+  private FeatureExpression featureExpression;
 
   protected AnnotationComparator comparator;
 
-  public RutaTypeMatcher(MatchReference mr) {
+  public RutaTypeMatcher(FeatureExpression expression) {
+    super();
+    this.featureExpression = expression;
+    this.comparator = new AnnotationComparator();
+  }
+
+  public RutaTypeMatcher(ITypeExpression expression) {
     super();
-    this.mr = mr;
+    this.typeExpression = expression;
     this.comparator = new AnnotationComparator();
   }
 
@@ -76,7 +83,6 @@ public class RutaTypeMatcher implements
     }
     MatchContext context = new MatchContext(null, null, true);
     context.setParent(parent);
-    FeatureExpression featureExpression = mr.getFeatureExpression(context, stream);
     if (featureExpression != null) {
       return featureExpression
               .getFeatureAnnotations(annotations, stream, context, CHECK_ON_FEATURE);
@@ -133,9 +139,8 @@ public class RutaTypeMatcher implements
       }
       MatchContext context = new MatchContext(null, null, true);
       context.setParent(parent);
-      FeatureExpression fm = mr.getFeatureExpression(context, stream);
-      if (fm != null) {
-        return fm.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
+      if (featureExpression != null) {
+        return featureExpression.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
       } else {
         return anchors;
       }
@@ -180,9 +185,8 @@ public class RutaTypeMatcher implements
       }
       MatchContext context = new MatchContext(null, null, true);
       context.setParent(parent);
-      FeatureExpression fm = mr.getFeatureExpression(context, stream);
-      if (fm != null) {
-        return fm.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
+      if (featureExpression != null) {
+        return featureExpression.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
       } else {
         return anchors;
       }
@@ -191,21 +195,29 @@ public class RutaTypeMatcher implements
   }
 
   public boolean match(AnnotationFS annotation, RutaStream stream, RutaBlock parent) {
+    // TODO refactor method, current state was chosen for debugging
     if (annotation == null) {
       return false;
     }
-    MatchContext context = new MatchContext(null, null, true);
-    context.setParent(parent);
-    FeatureExpression featureExpression = mr.getFeatureExpression(context, stream);
     if (featureExpression == null) {
       boolean b = checkType(annotation, stream, parent);
       if (b) {
         return true;
       }
     } else {
-      boolean b = checkFeature(annotation, stream, parent);
-      if (b) {
-        return true;
+
+      if (featureExpression.getFeatures(new MatchContext(parent), stream) == null) {
+        // hotfix for flawed feature expressions
+        boolean b = checkType(annotation, stream, parent);
+        if (b) {
+          return true;
+        }
+      } else {
+
+        boolean b = checkFeature(annotation, stream, parent);
+        if (b) {
+          return true;
+        }
       }
     }
 
@@ -232,10 +244,9 @@ public class RutaTypeMatcher implements
   private boolean checkFeature(AnnotationFS annotation, RutaStream stream, RutaBlock parent) {
     MatchContext context = new MatchContext(annotation, null, null, true);
     context.setParent(parent);
-    FeatureExpression fe = mr.getFeatureExpression(context, stream);
-    Feature feature = fe.getFeature(context, stream);
-    if (fe instanceof FeatureMatchExpression) {
-      FeatureMatchExpression fme = (FeatureMatchExpression) fe;
+    Feature feature = featureExpression.getFeature(context, stream);
+    if (featureExpression instanceof FeatureMatchExpression) {
+      FeatureMatchExpression fme = (FeatureMatchExpression) featureExpression;
       boolean checkFeatureValue = fme.checkFeatureValue(annotation, context, stream);
       if (checkFeatureValue) {
         return true;
@@ -252,14 +263,25 @@ public class RutaTypeMatcher implements
 
   @Override
   public String toString() {
-    return mr.toString();
+    IRutaExpression expression = getExpression();
+    if (expression != null) {
+      return expression.toString();
+    } else {
+      return "";
+    }
   }
 
-  public RutaExpression getExpression() {
-    return mr;
+  @Override
+  public IRutaExpression getExpression() {
+    if (featureExpression != null) {
+      return featureExpression;
+    } else if (typeExpression != null) {
+      return typeExpression;
+    }
+    return null;
   }
 
-  protected Type getType(TypeExpression expression, RutaBlock parent, RutaStream stream) {
+  protected Type getType(ITypeExpression expression, RutaBlock parent, RutaStream stream) {
     MatchContext context = new MatchContext(null, null, true);
     context.setParent(parent);
     Type type = expression.getType(context, stream);
@@ -270,19 +292,19 @@ public class RutaTypeMatcher implements
   }
 
   public long estimateAnchors(RutaBlock parent, RutaStream stream) {
-    MatchContext context = new MatchContext(null, null, true);
-    context.setParent(parent);
-    TypeExpression typeExpression = mr.getTypeExpression(context, stream);
     return stream.getHistogram(getType(typeExpression, parent, stream));
   }
 
   public List<Type> getTypes(RutaBlock parent, RutaStream stream) {
     List<Type> result = new ArrayList<Type>(1);
-    MatchContext context = new MatchContext(null, null, true);
-    context.setParent(parent);
-    TypeExpression typeExpression = mr.getTypeExpression(context, stream);
-    Type type = getType(typeExpression, parent, stream);
-    result.add(type);
+    if (typeExpression != null) {
+      Type type = getType(typeExpression, parent, stream);
+      result.add(type);
+    } else if (featureExpression != null) {
+      Type type = getType(featureExpression.getTypeExpr(new MatchContext(parent), stream), parent,
+              stream);
+      result.add(type);
+    }
     return result;
   }
 

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java Fri Nov 13 18:09:27 2015
@@ -271,15 +271,7 @@ public class ExpressionVerbalizer {
   }
 
   public String verbalize(MatchReference expression) {
-    String tail = "";
-    String head = expression.getMatch();
-    if (expression.getOp() != null) {
-      tail += expression.getOp();
-      if (expression.getArg() != null) {
-        tail += verbalize(expression.getArg());
-      }
-    }
-    return head + tail;
+    return expression.getMatch();
   }
 
   public String verbalize(FeatureExpression expression) {

Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java Fri Nov 13 18:09:27 2015
@@ -31,8 +31,6 @@ import org.apache.uima.ruta.RutaStatemen
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
 import org.apache.uima.ruta.expression.IRutaExpression;
-import org.apache.uima.ruta.expression.MatchReference;
-import org.apache.uima.ruta.expression.RutaExpression;
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.type.TypeExpression;
@@ -138,19 +136,17 @@ public class ScriptVerbalizer {
       RutaMatcher matcher = tmre.getMatcher();
       // action-only rule
       if (matcher instanceof RutaTypeMatcher) {
-        RutaExpression expression = ((RutaTypeMatcher) matcher).getExpression();
-        if (expression instanceof MatchReference) {
-          MatchReference mr = (MatchReference) expression;
-          if (mr.getMatch() == null) {
-            Iterator<AbstractRutaAction> ait = actions.iterator();
-            while (ait.hasNext()) {
-              AbstractRutaAction each = ait.next();
-              result.append(verbalizer.verbalize(each));
-              if (ait.hasNext()) {
-                result.append(",");
-              }
+        IRutaExpression expression = ((RutaTypeMatcher) matcher).getExpression();
+        if(expression != null) {
+          result.append(verbalizer.verbalize(expression));
+        } else {
+          Iterator<AbstractRutaAction> ait = actions.iterator();
+          while (ait.hasNext()) {
+            AbstractRutaAction each = ait.next();
+            result.append(verbalizer.verbalize(each));
+            if (ait.hasNext()) {
+              result.append(",");
             }
-            return result.toString();
           }
         }
       }