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 2016/01/05 12:19:15 UTC

svn commit: r1723045 - in /uima/ruta/trunk: ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/ ruta-core/src/main/java/org/apache/uima/ruta/ ruta-core/src/main/java/org/apache/uima/ruta/action/ ruta-core/src/main/java/org/apache/uima/ruta/expressio...

Author: pkluegl
Date: Tue Jan  5 11:19:14 2016
New Revision: 1723045

URL: http://svn.apache.org/viewvc?rev=1723045&view=rev
Log:
UIMA-4310
- implicit action for assignments to variables

Added:
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java   (with props)
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationListExpression.java   (with props)
Modified:
    uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java
    uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g

Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Tue Jan  5 11:19:14 2016
@@ -1028,6 +1028,7 @@ listExpression returns [ListExpression e
 	| (floatListExpression)=> dl = floatListExpression {expr = dl;}
 	| (stringListExpression)=> sl = stringListExpression {expr = sl;}
 	| (typeListExpression)=> tl = typeListExpression {expr = tl;}
+	| (annotationListExpression)=> ale = annotationListExpression {expr = ale;}
 	| (untypedListExpression)=> utl = untypedListExpression {expr = utl;}
 	;
 
@@ -1251,6 +1252,13 @@ featureAssignmentExpression returns [Fea
 	}
 	;
 	
+variableAssignmentAction returns [AbstractRutaAction a = null]
+	:
+	var = variable op = ASSIGN_EQUAL arg = argument
+	{
+	a = ActionFactory.createImplicitVariableAssignmentAction(var, op, arg, $blockDeclaration::env);
+	}
+	;
 	
 variable returns [Token var = null]
 	:
@@ -1265,6 +1273,7 @@ listVariable returns [Token var = null]
 	||isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "FLOATLIST")
 	||isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "STRINGLIST")
 	||isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "TYPELIST")
+	||isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "ANNOTATIONLIST")
 	}? v = Identifier {var = v;}
 	;
 
@@ -1590,6 +1599,7 @@ action  returns [AbstractRutaAction resu
 	| a = actionRemoveRetainType
 	| a = actionAddFilterType
 	| a = actionRemoveFilterType
+	| (variableAssignmentAction)=> vae = variableAssignmentAction {a = vae;}
 	| (externalAction)=> a = externalAction
 	| (featureAssignmentExpression)=> fae = featureAssignmentExpression {a = ActionFactory.createAction(fae);}
 	| (typeExpression)=> te = typeExpression {a = ActionFactory.createAction(te);}
@@ -2212,8 +2222,7 @@ annotationExpression returns [IRutaExpre
 	{isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "ANNOTATION")	}? 
 	id = Identifier {expr = ExpressionFactory.createAnnotationVariableExpression(id);} 
 	|
-	{isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "ANNOTATIONLIST")	}? 
-	id = Identifier {expr = ExpressionFactory.createAnnotationListVariableExpression(id);} 
+	ale = annotationListExpression {expr = ale;}
 	|
 	aae = annotationAddressExpression {expr = aae;}
 	|
@@ -2225,12 +2234,18 @@ annotationExpression2 returns [IRutaExpr
 	{isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "ANNOTATION")}? 
 	id = Identifier {expr = ExpressionFactory.createAnnotationVariableExpression(id);} 
 	|
-	{isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "ANNOTATIONLIST")}? 
-	id = Identifier {expr = ExpressionFactory.createAnnotationListVariableExpression(id);} 
+	ale = annotationListExpression {expr = ale;}
 	|
 	aae = annotationAddressExpression {expr = aae;}
 	;
 
+annotationListExpression returns [ListExpression expr = null]
+	:
+	{isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "ANNOTATIONLIST")}? 
+	id = Identifier {expr = ExpressionFactory.createAnnotationListVariableExpression(id);} 
+	;
+	
+
 annotationAddressExpression returns [IAnnotationExpression expr = null]
 	:
 	ADDRESS_PREFIX address = DecimalLiteral {expr = ExpressionFactory.createAnnotationAddressExpression(address);}

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java Tue Jan  5 11:19:14 2016
@@ -706,7 +706,13 @@ public class RutaEnvironment {
   }
 
   public boolean isVariable(String name) {
-    return ownsVariable(name) || owner.getParent().getEnvironment().isVariable(name);
+    if (ownsVariable(name)) {
+      return true;
+    }
+    if (owner != null && owner.getParent() != null) {
+      return owner.getParent().getEnvironment().isVariable(name);
+    }
+    return false;
   }
 
   public boolean isVariableOfType(String name, String type) {

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Tue Jan  5 11:19:14 2016
@@ -49,6 +49,7 @@ import org.apache.uima.ruta.engine.RutaE
 import org.apache.uima.ruta.expression.AnnotationTypeExpression;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationListExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
 import org.apache.uima.ruta.expression.feature.FeatureExpression;
 import org.apache.uima.ruta.expression.feature.GenericFeatureExpression;
@@ -59,6 +60,7 @@ import org.apache.uima.ruta.expression.t
 import org.apache.uima.ruta.rule.AbstractRule;
 import org.apache.uima.ruta.rule.AbstractRuleMatch;
 import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.rule.RuleElement;
 import org.apache.uima.ruta.type.RutaAnnotation;
 import org.apache.uima.ruta.type.RutaBasic;
 import org.apache.uima.ruta.utils.UIMAUtils;
@@ -977,6 +979,22 @@ public class RutaStream extends FSIterat
           annotation.setFeatureValue(feature, a);
         }
       }
+    } else if (value instanceof IAnnotationListExpression && !feature.getRange().isPrimitive()) {
+      IAnnotationListExpression ale = (IAnnotationListExpression) value;
+      List<AnnotationFS> annotations = ale.getAnnotations(context, this);
+      if (annotations != null) {
+        if (feature.getRange().isArray()) {
+          annotation.setFeatureValue(feature, UIMAUtils.toFSArray(this.getJCas(), annotations));
+        } else {
+          if (annotations.isEmpty()) {
+            annotation.setFeatureValue(feature, null);
+          } else {
+            annotation.setFeatureValue(feature, annotations.get(0));
+          }
+        }
+      } else {
+        annotation.setFeatureValue(feature, null);
+      }
     } else if (value instanceof ITypeExpression && !feature.getRange().isPrimitive()) {
       ITypeExpression typeExpr = (ITypeExpression) value;
       Type t = typeExpr.getType(context, this);
@@ -1027,17 +1045,52 @@ public class RutaStream extends FSIterat
     }
   }
 
+  public void assignVariable(String var, IRutaExpression expression, MatchContext context,
+          RutaStream stream) {
+    RuleElement element = context.getElement();
+    RutaBlock parent = element.getParent();
+    RutaEnvironment environment = parent.getEnvironment();
+    Class<?> clazz = environment.getVariableType(var);
+    if (clazz.equals(Double.class) && expression instanceof INumberExpression) {
+      double v = ((INumberExpression) expression).getDoubleValue(context, stream);
+      environment.setVariableValue(var, v);
+    } else if (clazz.equals(Integer.class) && expression instanceof INumberExpression) {
+      int v = ((INumberExpression) expression).getIntegerValue(context, stream);
+      environment.setVariableValue(var, v);
+    } else if (clazz.equals(Type.class) && expression instanceof ITypeExpression) {
+      Type v = ((ITypeExpression) expression).getType(context, stream);
+      environment.setVariableValue(var, v);
+    } else if (clazz.equals(Boolean.class) && expression instanceof IBooleanExpression) {
+      boolean v = ((IBooleanExpression) expression).getBooleanValue(context, stream);
+      environment.setVariableValue(var, v);
+    } else if (clazz.equals(String.class) && expression instanceof IStringExpression) {
+      String v = ((IStringExpression) expression).getStringValue(context, stream);
+      environment.setVariableValue(var, v);
+    } else if (clazz.equals(AnnotationFS.class) && expression instanceof IAnnotationExpression) {
+      AnnotationFS v = ((IAnnotationExpression) expression).getAnnotation(context, stream);
+      environment.setVariableValue(var, v);
+    } else if (clazz.equals(List.class)) {
+      Class<?> variableGenericType = environment.getVariableGenericType(var);
+      if (variableGenericType.equals(AnnotationFS.class)
+              && expression instanceof IAnnotationListExpression) {
+        List<AnnotationFS> v = ((IAnnotationListExpression) expression).getAnnotations(context,
+                stream);
+        environment.setVariableValue(var, v);
+      }
+    }
+  }
+
   public AnnotationFS getSingleAnnotationByTypeInContext(Type type, MatchContext context) {
     List<AnnotationFS> inWindow = this.getAnnotationsInWindow(context.getAnnotation(), type);
-    if(inWindow != null&& !inWindow.isEmpty()) {
+    if (inWindow != null && !inWindow.isEmpty()) {
       return inWindow.get(0);
     }
     return null;
   }
-  
+
   public List<AnnotationFS> getAnnotationsByTypeInContext(Type type, MatchContext context) {
     List<AnnotationFS> inWindow = this.getAnnotationsInWindow(context.getAnnotation(), type);
     return inWindow;
   }
-  
+
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java Tue Jan  5 11:19:14 2016
@@ -265,6 +265,13 @@ public class ActionFactory {
     return new ImplicitMarkAction(te);
   }
 
+  public static AbstractRutaAction createImplicitVariableAssignmentAction(Token var, Token op,
+          IRutaExpression arg, RutaBlock env) {
+    String varString = var != null ?  var.getText() : null;
+    String opString = op != null ?  op.getText() : "=";
+    return new ImplicitVariableAssignmentAction(varString, opString, arg);
+  }
+  
   public static AbstractRutaAction createMarkFirstAction(ITypeExpression type, RutaBlock env) {
     return new MarkFirstAction(type);
   }
@@ -280,4 +287,6 @@ public class ActionFactory {
     return new SplitAction(type, complete, appendToBegin, appendToEnd);
   }
 
+  
+
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java Tue Jan  5 11:19:14 2016
@@ -19,22 +19,9 @@
 
 package org.apache.uima.ruta.action;
 
-import java.util.List;
-
-import org.apache.uima.cas.Type;
-import org.apache.uima.cas.text.AnnotationFS;
-import org.apache.uima.ruta.RutaBlock;
-import org.apache.uima.ruta.RutaEnvironment;
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.IRutaExpression;
-import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
-import org.apache.uima.ruta.expression.annotation.IAnnotationListExpression;
-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.expression.type.ITypeExpression;
 import org.apache.uima.ruta.rule.MatchContext;
-import org.apache.uima.ruta.rule.RuleElement;
 import org.apache.uima.ruta.visitor.InferenceCrowd;
 
 public class AssignAction extends AbstractRutaAction {
@@ -51,35 +38,7 @@ public class AssignAction extends Abstra
 
   @Override
   public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
-    RuleElement element = context.getElement();
-    RutaBlock parent = element.getParent();
-    RutaEnvironment environment = parent.getEnvironment();
-    Class<?> clazz = environment.getVariableType(var);
-    if (clazz.equals(Double.class) && expression instanceof INumberExpression) {
-      double v = ((INumberExpression) expression).getDoubleValue(context, stream);
-      environment.setVariableValue(var, v);
-    } else if (clazz.equals(Integer.class) && expression instanceof INumberExpression) {
-      int v = ((INumberExpression) expression).getIntegerValue(context, stream);
-      environment.setVariableValue(var, v);
-    } else if (clazz.equals(Type.class) && expression instanceof ITypeExpression) {
-      Type v = ((ITypeExpression) expression).getType(context, stream);
-      environment.setVariableValue(var, v);
-    } else if (clazz.equals(Boolean.class) && expression instanceof IBooleanExpression) {
-      boolean v = ((IBooleanExpression) expression).getBooleanValue(context, stream);
-      environment.setVariableValue(var, v);
-    } else if (clazz.equals(String.class) && expression instanceof IStringExpression) {
-      String v = ((IStringExpression) expression).getStringValue(context, stream);
-      environment.setVariableValue(var, v);
-    } else if (clazz.equals(AnnotationFS.class) && expression instanceof IAnnotationExpression) {
-      AnnotationFS v = ((IAnnotationExpression) expression).getAnnotation(context, stream);
-      environment.setVariableValue(var, v);
-    } else if(clazz.equals(List.class)) {
-      Class<?> variableGenericType = environment.getVariableGenericType(var);
-      if(variableGenericType.equals(AnnotationFS.class) && expression instanceof IAnnotationListExpression) {
-         List<AnnotationFS> v = ((IAnnotationListExpression) expression).getAnnotations(context, stream);
-         environment.setVariableValue(var, v);
-      }
-    }
+    stream.assignVariable(var, expression, context, stream);
   }
 
   public String getVar() {

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java?rev=1723045&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java Tue Jan  5 11:19:14 2016
@@ -0,0 +1,63 @@
+/*
+ * 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.action;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.IRutaExpression;
+import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+public class ImplicitVariableAssignmentAction extends AbstractRutaAction {
+
+  private final String var;
+
+  private final String op;
+
+  private final IRutaExpression arg;
+
+  public ImplicitVariableAssignmentAction(String varString, String opString, IRutaExpression arg) {
+    super();
+    this.var = varString;
+    this.op = opString;
+    this.arg = arg;
+  }
+
+  @Override
+  public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
+    // only normal assignment is supported right now
+    if(StringUtils.equals(op, "=")) {
+      stream.assignVariable(var, arg, context, stream);
+    }
+  }
+
+  public String getVar() {
+    return var;
+  }
+
+  public String getOp() {
+    return op;
+  }
+
+  public IRutaExpression getArg() {
+    return arg;
+  }
+
+}

Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java Tue Jan  5 11:19:14 2016
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.antlr.runtime.Token;
 import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.expression.annotation.AbstractAnnotationListExpression;
 import org.apache.uima.ruta.expression.annotation.AnnotationAddressExpression;
 import org.apache.uima.ruta.expression.annotation.AnnotationFeatureExpression;
 import org.apache.uima.ruta.expression.annotation.AnnotationLabelExpression;
@@ -314,7 +315,7 @@ public class ExpressionFactory {
     return new AnnotationVariableExpression(var.getText());
   }
 
-  public static IRutaExpression createAnnotationListVariableExpression(Token var) {
+  public static AbstractAnnotationListExpression createAnnotationListVariableExpression(Token var) {
     return new AnnotationListVariableExpression(var.getText());
   }
 

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationListExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationListExpression.java?rev=1723045&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationListExpression.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationListExpression.java Tue Jan  5 11:19:14 2016
@@ -0,0 +1,27 @@
+/*
+ * 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 org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.expression.list.ListExpression;
+
+public abstract class AbstractAnnotationListExpression extends ListExpression<AnnotationFS> implements IAnnotationListExpression{
+
+}

Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationListExpression.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java Tue Jan  5 11:19:14 2016
@@ -34,7 +34,7 @@ import org.apache.uima.ruta.rule.MatchCo
  * An expression referring to annotations (FSArray) stored in a feature.
  *
  */
-public class AnnotationListFeatureExpression extends ListExpression<AnnotationFS> implements IAnnotationListExpression {
+public class AnnotationListFeatureExpression extends AbstractAnnotationListExpression {
 
   private FeatureExpression fe;
 

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java Tue Jan  5 11:19:14 2016
@@ -27,7 +27,7 @@ import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.list.ListExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
-public class AnnotationListVariableExpression extends ListExpression<AnnotationFS> implements IAnnotationListExpression{
+public class AnnotationListVariableExpression extends AbstractAnnotationListExpression {
 
   private String var;
 

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java Tue Jan  5 11:19:14 2016
@@ -43,6 +43,7 @@ import org.apache.uima.ruta.action.GetLi
 import org.apache.uima.ruta.action.GreedyAnchoringAction;
 import org.apache.uima.ruta.action.ImplicitFeatureAction;
 import org.apache.uima.ruta.action.ImplicitMarkAction;
+import org.apache.uima.ruta.action.ImplicitVariableAssignmentAction;
 import org.apache.uima.ruta.action.LogAction;
 import org.apache.uima.ruta.action.MarkAction;
 import org.apache.uima.ruta.action.MarkFastAction;
@@ -167,6 +168,8 @@ public class ActionVerbalizer {
       return "";
     } else if (action instanceof ImplicitFeatureAction) {
       return "";
+    } else if (action instanceof ImplicitVariableAssignmentAction) {
+      return "";
     }
 
     return action.getClass().getSimpleName();
@@ -492,6 +495,9 @@ public class ActionVerbalizer {
     } else if (action instanceof ImplicitFeatureAction) {
       ImplicitFeatureAction a = (ImplicitFeatureAction) action;
       return verbalizer.verbalize(a.getExpr());
+    } else if (action instanceof ImplicitVariableAssignmentAction) {
+      ImplicitVariableAssignmentAction a = (ImplicitVariableAssignmentAction) action;
+      return a.getVar() + a.getOp() + verbalizer.verbalize(a.getArg());
     }
 
     return action.getClass().getSimpleName();

Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java (original)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java Tue Jan  5 11:19:14 2016
@@ -86,7 +86,99 @@ public class AnnotationVariableExpressio
     assertNotNull("Feature value is null!", a);
     assertEquals("Some", a.getCoveredText());
   }
+  
+  @Test
+  public void testImplicitAssignment() {
+    String document = "Some text.";
+    String script = "ANNOTATION a;";
+    script += "CW{-> a = CW};";
+    script += "a{-> T1};";
+    script += "W W{-> CREATE(Struct, \"a\"=a)};";
+
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    String typeName = "Struct";
+    typeMap.put(typeName, "uima.tcas.Annotation");
+
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put(typeName, list);
+    String fn = "a";
+    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+    AnnotationFS next = null;
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some");
+
+    t = cas.getTypeSystem().getType(typeName);
+    Feature f1 = t.getFeatureByBaseName(fn);
+    ai = cas.getAnnotationIndex(t);
+
+    assertEquals(1, ai.size());
+    iterator = ai.iterator();
+    next = iterator.next();
+    assertEquals("text", next.getCoveredText());
+    AnnotationFS a = (AnnotationFS) next.getFeatureValue(f1);
+    assertNotNull("Feature value is null!", a);
+    assertEquals("Some", a.getCoveredText());
+  }
+
+  @Test
+  public void testListImplicitAssignment() {
+    String document = "Some text.";
+    String script = "ANNOTATIONLIST as;";
+    script += "Document{-> as = W};";
+    script += "as{-> T1};";
+    script += "W W{-> CREATE(Struct, \"as\"=as)};";
+
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    String typeName = "Struct";
+    typeMap.put(typeName, "uima.tcas.Annotation");
 
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put(typeName, list);
+    String fn = "as";
+    list.add(new TestFeature(fn, "", "uima.cas.FSArray"));
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+    AnnotationFS next = null;
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "Some", "text");
+
+    t = cas.getTypeSystem().getType(typeName);
+    Feature f1 = t.getFeatureByBaseName(fn);
+    ai = cas.getAnnotationIndex(t);
+
+    assertEquals(1, ai.size());
+    iterator = ai.iterator();
+    next = iterator.next();
+    assertEquals("text", next.getCoveredText());
+    FSArray array = (FSArray) next.getFeatureValue(f1);
+    assertNotNull("Feature value is null!", array);
+    assertEquals(2, array.size());
+  }
+  
   @Test
   public void testList() {
     String document = "Some text.";
@@ -132,5 +224,4 @@ public class AnnotationVariableExpressio
     assertNotNull("Feature value is null!", array);
     assertEquals(2, array.size());
   }
-  
 }

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1723045&r1=1723044&r2=1723045&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Tue Jan  5 11:19:14 2016
@@ -870,6 +870,7 @@ listExpression returns [Expression expr
 	| (floatListExpression)=> e = floatListExpression {expr = e;}
 	| (stringListExpression)=> e = stringListExpression {expr = e;}
 	| (typeListExpression)=> e = typeListExpression {expr = e;}
+	| (annotationListExpression)=> e = annotationListExpression {expr = e;}
 	| (untypedListExpression)=> utl = untypedListExpression {expr = utl;}
 	;
 
@@ -1074,6 +1075,14 @@ variable returns [Expression var = null]
 	;	
 	
 
+variableAssignmentAction returns [RutaAction a = null]
+	:
+	var = variable op = ASSIGN_EQUAL arg = argument
+	{
+	a = ActionFactory.createAction(var, arg);
+	}
+	;
+
 listVariable returns [Expression var = null]
 	:
 	{isVariableOfType(input.LT(1).getText(), "BOOLEANLIST")
@@ -1082,6 +1091,7 @@ listVariable returns [Expression var = n
 	||isVariableOfType(input.LT(1).getText(), "DOUBLELIST")
 	||isVariableOfType(input.LT(1).getText(), "STRINGLIST")
 	||isVariableOfType(input.LT(1).getText(), "TYPELIST")
+	||isVariableOfType(input.LT(1).getText(), "ANNOTATIONLIST")
 	}? v = Identifier {var=ExpressionFactory.createGenericVariableReference(v);}
 	;
 	
@@ -1505,6 +1515,7 @@ result = ActionFactory.createEmptyAction
 	| a = actionAddRetainType
 	| a = actionRemoveFilterType
 	| a = actionRemoveRetainType
+	| (variableAssignmentAction)=> vae = variableAssignmentAction {a = vae;}
 	| (externalAction)=> a = externalAction
 	| (featureAssignmentExpression)=> fae = featureAssignmentExpression {a = ActionFactory.createAction(fae);}
 	| (typeExpression)=> te = typeExpression {a = ActionFactory.createAction(te);}
@@ -2587,15 +2598,18 @@ annotationExpression returns [Expression
 	{isVariableOfType(input.LT(1).getText(), "ANNOTATION")}? 
 	id = Identifier {expr = ExpressionFactory.createAnnotationTypeVariableReference(id);} 
 	|
-	{isVariableOfType(input.LT(1).getText(), "ANNOTATIONLIST")}? 
-	id = Identifier {expr = ExpressionFactory.createAnnotationTypeVariableReference(id);} 
+	ale = annotationListExpression {expr = ale;}
 	|
 	aae = annotationAddressExpression {expr = aae;}
 	|
 	ale = annotationLabelExpression {expr = ale;}
 	;  
 
-
+annotationListExpression returns [Expression expr = null]
+	:
+	{isVariableOfType(input.LT(1).getText(), "ANNOTATIONLIST")}? 
+	id = Identifier {expr = ExpressionFactory.createAnnotationTypeVariableReference(id);} 
+	;
 
 annotationAddressExpression returns [Expression expr = null]
 	: