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 2020/03/24 20:25:22 UTC

svn commit: r1875586 - in /uima/uv3/ruta-v3/trunk: ruta-core-ext/src/main/java/org/apache/uima/ruta/block/ ruta-core-ext/src/main/java/org/apache/uima/ruta/block/fst/ ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/ ruta-core/src/main/java/org/ap...

Author: pkluegl
Date: Tue Mar 24 20:25:21 2020
New Revision: 1875586

URL: http://svn.apache.org/viewvc?rev=1875586&view=rev
Log:
merged v2: UIMA-6195, UIMA-6194, UIMA-6193, UIMA-6192, UIMA-6191, UIMA-6183, UIMA-6171

Added:
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AssignActionTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/VariableInitialValueTest.java
Modified:
    uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java
    uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/fst/FSTBlock.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/RemoveDuplicateAction.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContainsCondition.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/AbstractBooleanListExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListVariableExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListVariableExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/SimpleNumberListExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/SimpleStringListExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListVariableExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/SimpleTypeListExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaLiteralMatcher.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/NewCASPipelineTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AddTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/ImplicitActionTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/InListTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/NoSeedersTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/NullExpressionTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/LiteralStringMatchTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/ManualAnchoringTest.java
    uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/RuleInference3Test.java
    uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.howtos.xml
    uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml
    uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.expressions.xml
    uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.xml
    uima/uv3/ruta-v3/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g

Modified: uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java Tue Mar 24 20:25:21 2020
@@ -28,6 +28,7 @@ import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.ScriptApply;
 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.RuleApply;
 import org.apache.uima.ruta.rule.RuleMatch;
 import org.apache.uima.ruta.rule.RutaRuleElement;
@@ -47,6 +48,7 @@ public class OnlyFirstBlock extends Ruta
   @Override
   public ScriptApply apply(RutaStream stream, InferenceCrowd crowd) {
     BlockApply result = new BlockApply(this);
+    getEnvironment().ensureMaterializedInitialValues(new MatchContext(this), stream);
     crowd.beginVisit(this, result);
     RuleApply apply = rule.apply(stream, crowd, true);
     for (AbstractRuleMatch<? extends AbstractRule> eachMatch : apply.getList()) {
@@ -63,24 +65,24 @@ public class OnlyFirstBlock extends Ruta
         boolean stop = false;
         Type type = ((RutaRuleElement) rule.getRuleElements().get(0)).getMatcher()
                 .getType(getParent() == null ? this : getParent(), stream);
-          RutaStream window = stream.getWindowStream(each, type);
-          for (RutaStatement element : getElements()) {
-            if (stop)
-              break;
-            if (element != null) {
-              ScriptApply elementApply = element.apply(window, crowd);
-              if (elementApply instanceof BlockApply) {
-                BlockApply ba = (BlockApply) elementApply;
-                if (ba.getRuleApply().getApplied() > 0) {
-                  stop = true;
-                }
-              } else if (elementApply instanceof RuleApply) {
-                RuleApply ra = (RuleApply) elementApply;
-                if (ra.getApplied() > 0) {
-                  stop = true;
-                }
+        RutaStream window = stream.getWindowStream(each, type);
+        for (RutaStatement element : getElements()) {
+          if (stop)
+            break;
+          if (element != null) {
+            ScriptApply elementApply = element.apply(window, crowd);
+            if (elementApply instanceof BlockApply) {
+              BlockApply ba = (BlockApply) elementApply;
+              if (ba.getRuleApply().getApplied() > 0) {
+                stop = true;
+              }
+            } else if (elementApply instanceof RuleApply) {
+              RuleApply ra = (RuleApply) elementApply;
+              if (ra.getApplied() > 0) {
+                stop = true;
               }
             }
+          }
         }
       }
     }

Modified: uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/fst/FSTBlock.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/fst/FSTBlock.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/fst/FSTBlock.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/fst/FSTBlock.java Tue Mar 24 20:25:21 2020
@@ -30,6 +30,7 @@ import org.apache.uima.ruta.block.BlockA
 import org.apache.uima.ruta.block.RutaBlock;
 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.RuleApply;
 import org.apache.uima.ruta.rule.RuleMatch;
 import org.apache.uima.ruta.rule.RutaRule;
@@ -49,6 +50,7 @@ public class FSTBlock extends RutaBlock
   @Override
   public ScriptApply apply(RutaStream stream, InferenceCrowd crowd) {
     BlockApply result = new BlockApply(this);
+    getEnvironment().ensureMaterializedInitialValues(new MatchContext(this), stream);
     crowd.beginVisit(this, result);
     RuleApply apply = rule.apply(stream, crowd, true);
     for (AbstractRuleMatch<? extends AbstractRule> eachMatch : apply.getList()) {

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Tue Mar 24 20:25:21 2020
@@ -184,6 +184,11 @@ public void setExternalFactory(RutaExter
     	      String msg = "Error in "+name+",  line " + line + ", \"" + text + "\": missing " + stringMissing
                     + ", but found " + stringFound;
     	      emitErrorMessage(msg);
+    	    } else if (e instanceof FailedPredicateException) {
+	      FailedPredicateException fpe = (FailedPredicateException) e;
+	      String msg = "Error in " + name + ",  line " + line + ", \"" + text + "\": Failed predicate: "
+	              + fpe.predicateText;
+	      emitErrorMessage(msg);
 	    } else {
 	      emitErrorMessage(e.getMessage());
 	    }
@@ -1707,11 +1712,19 @@ conditionFeature returns [AbstractRutaCo
     ;   
 
 conditionParse returns [AbstractRutaCondition cond = null]
-    :
-    PARSE LPAREN {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier 
+options {
+	backtrack = true;
+}   :
+    PARSE LPAREN
+    ( 
+    se = stringExpression COMMA
+    {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier 
+    |
+    {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier 
+    )
     (COMMA locale = stringExpression)?
     RPAREN
-    {cond = conditionFactory.createConditionParse(id, locale, $blockDeclaration::env);}
+    {cond = conditionFactory.createConditionParse(se, id, locale, $blockDeclaration::env);}
     ;
 
 conditionIs returns [AbstractRutaCondition cond = null]
@@ -2172,6 +2185,15 @@ actionAssign returns [AbstractRutaAction
     {isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "DOUBLE")}? 
         nv = Identifier COMMA e5 = numberExpression 
         {action = actionFactory.createAssignAction(nv, e5,$blockDeclaration::env);}
+    |
+    {isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "BOOLEANLIST")||
+     isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "INTLIST")||
+     isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "DOUBLELIST")||
+     isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "FLOATLIST")||
+     isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "STRINGLIST")||
+     isVariableOfType($blockDeclaration::env, input.LT(1).getText(), "TYPELIST")}? 
+        nv = Identifier COMMA e7 = listExpression 
+        {action = actionFactory.createAssignAction(nv, e7,$blockDeclaration::env);}
     ) RPAREN
     ;
 

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java Tue Mar 24 20:25:21 2020
@@ -57,6 +57,7 @@ import org.apache.uima.ruta.block.RutaBl
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
 import org.apache.uima.ruta.engine.RutaEngine;
 import org.apache.uima.ruta.expression.IRutaExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
 import org.apache.uima.ruta.expression.bool.SimpleBooleanListExpression;
 import org.apache.uima.ruta.expression.list.ListExpression;
@@ -70,6 +71,7 @@ import org.apache.uima.ruta.expression.r
 import org.apache.uima.ruta.expression.resource.WordTableExpression;
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.string.SimpleStringListExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
 import org.apache.uima.ruta.expression.type.SimpleTypeListExpression;
 import org.apache.uima.ruta.resource.CSVTable;
@@ -1198,4 +1200,38 @@ public class RutaEnvironment {
     }
   }
 
+  public void ensureMaterializedInitialValues(MatchContext matchContext, RutaStream stream) {
+
+    for (Entry<String, Object> entry : new ArrayList<>(initializedVariables.entrySet())) {
+      String var = entry.getKey();
+      Object value = entry.getValue();
+
+      if (value instanceof IAnnotationExpression || value instanceof IBooleanExpression
+              || value instanceof INumberExpression || value instanceof IStringExpression
+              || value instanceof ITypeExpression) {
+        Class<?> clazz = variableTypes.get(var);
+        Object expressionValue = stream.getExpressionValue(clazz, (IRutaExpression) value,
+                matchContext);
+        initializedVariables.put(var, expressionValue);
+        variableValues.put(var, expressionValue);
+      } else if (value instanceof List) {
+        List<?> list = (List<?>) value;
+        List<Object> newList = new ArrayList<>(list.size());
+        Class<?> clazz = variableGenericTypes.get(var);
+        for (Object each : list) {
+          if (each instanceof IAnnotationExpression || each instanceof IBooleanExpression
+                  || each instanceof INumberExpression || each instanceof IStringExpression
+                  || each instanceof ITypeExpression) {
+            Object expressionValue = stream.getExpressionValue(clazz, (IRutaExpression) each,
+                    matchContext);
+            newList.add(expressionValue);
+          } else {
+            newList.add(each);
+          }
+        }
+        initializedVariables.put(var, newList);
+        variableValues.put(var, new ArrayList<>(newList));
+      }
+    }
+  }
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Tue Mar 24 20:25:21 2020
@@ -66,6 +66,7 @@ import org.apache.uima.ruta.expression.b
 import org.apache.uima.ruta.expression.bool.IBooleanListExpression;
 import org.apache.uima.ruta.expression.feature.CoveredTextFeature;
 import org.apache.uima.ruta.expression.feature.FeatureExpression;
+import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
 import org.apache.uima.ruta.expression.feature.GenericFeatureExpression;
 import org.apache.uima.ruta.expression.feature.LazyFeature;
 import org.apache.uima.ruta.expression.feature.SimpleFeatureExpression;
@@ -75,6 +76,7 @@ import org.apache.uima.ruta.expression.n
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.string.IStringListExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeListExpression;
 import org.apache.uima.ruta.rule.AbstractRule;
 import org.apache.uima.ruta.rule.AbstractRuleMatch;
 import org.apache.uima.ruta.rule.MatchContext;
@@ -1225,8 +1227,7 @@ public class RutaStream {
   }
 
   public void assignVariable(String var, IRutaExpression expression, MatchContext context) {
-    RuleElement element = context.getElement();
-    RutaBlock parent = element.getParent();
+    RutaBlock parent = context.getParent();
     RutaEnvironment environment = parent.getEnvironment();
     Class<?> clazz = environment.getVariableType(var);
     if (clazz.equals(Double.class) && expression instanceof INumberExpression) {
@@ -1257,11 +1258,73 @@ public class RutaStream {
         List<AnnotationFS> v = ((IAnnotationListExpression) expression).getAnnotationList(context,
                 this);
         environment.setVariableValue(var, v);
+      } else if (variableGenericType.equals(Boolean.class)
+              && expression instanceof IBooleanListExpression) {
+        List<Boolean> v = ((IBooleanListExpression) expression).getBooleanList(context, this);
+        environment.setVariableValue(var, v);
+      } else if (Number.class.isAssignableFrom(variableGenericType)
+              && expression instanceof INumberListExpression) {
+        List<Number> v = ((INumberListExpression) expression).getNumberList(context, this);
+        environment.setVariableValue(var, v);
+      } else if (variableGenericType.equals(String.class)
+              && expression instanceof IStringListExpression) {
+        List<String> v = ((IStringListExpression) expression).getStringList(context, this);
+        environment.setVariableValue(var, v);
+      } else if (variableGenericType.equals(Type.class)
+              && expression instanceof ITypeListExpression) {
+        List<Type> v = ((ITypeListExpression) expression).getTypeList(context, this);
+        environment.setVariableValue(var, v);
+      }
+    } else if (clazz.equals(Boolean.class) && expression instanceof AnnotationTypeExpression) {
+      // special not yet supported use case: b = a1==a2
+      // TODO: this should be solved by having a boolean expression and an atomic feature
+      // expression?
+      AnnotationTypeExpression ate = (AnnotationTypeExpression) expression;
+      AnnotationFS annotation = ate.getAnnotation(context, this);
+      FeatureExpression featureExpression = ate.getFeatureExpression();
+      if (featureExpression instanceof FeatureMatchExpression) {
+        FeatureMatchExpression fme = (FeatureMatchExpression) featureExpression;
+        IRutaExpression arg = fme.getArg();
+        if (arg instanceof IAnnotationExpression) {
+          AnnotationFS argAnnotation = ((IAnnotationExpression) arg).getAnnotation(context, this);
+          if (StringUtils.equals(fme.getOp(), "==")) {
+            environment.setVariableValue(var, annotation == argAnnotation);
+          } else if (StringUtils.equals(fme.getOp(), "!=")) {
+            environment.setVariableValue(var, annotation != argAnnotation);
+          }
+        }
       }
-      // TODO assign also other lists
     }
   }
 
+  @SuppressWarnings("unchecked")
+  public <T extends Object> T getExpressionValue(Class<T> clazz, IRutaExpression expression,
+          MatchContext context) {
+    if (clazz.equals(Double.class) && expression instanceof INumberExpression) {
+      double v = ((INumberExpression) expression).getDoubleValue(context, this);
+      return (T) Double.valueOf(v);
+    } else if (clazz.equals(Float.class) && expression instanceof INumberExpression) {
+      float v = (float) ((INumberExpression) expression).getDoubleValue(context, this);
+      return (T) Float.valueOf(v);
+    } else if (clazz.equals(Integer.class) && expression instanceof INumberExpression) {
+      int v = ((INumberExpression) expression).getIntegerValue(context, this);
+      return (T) Integer.valueOf(v);
+    } else if (clazz.equals(Type.class) && expression instanceof ITypeExpression) {
+      Type v = ((ITypeExpression) expression).getType(context, this);
+      return (T) v;
+    } else if (clazz.equals(Boolean.class) && expression instanceof IBooleanExpression) {
+      boolean v = ((IBooleanExpression) expression).getBooleanValue(context, this);
+      return (T) Boolean.valueOf(v);
+    } else if (clazz.equals(String.class) && expression instanceof IStringExpression) {
+      String v = ((IStringExpression) expression).getStringValue(context, this);
+      return (T) v;
+    } else if (clazz.equals(AnnotationFS.class) && expression instanceof IAnnotationExpression) {
+      AnnotationFS v = ((IAnnotationExpression) expression).getAnnotation(context, this);
+      return (T) v;
+    }
+    return null;
+  }
+
   public AnnotationFS getSingleAnnotationByTypeInContext(Type type, MatchContext context) {
     List<AnnotationFS> inWindow = this.getAnnotationsInWindow(context.getAnnotation(), type);
     if (inWindow != null && !inWindow.isEmpty()) {

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/RemoveDuplicateAction.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/RemoveDuplicateAction.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/RemoveDuplicateAction.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/RemoveDuplicateAction.java Tue Mar 24 20:25:21 2020
@@ -75,6 +75,6 @@ public class RemoveDuplicateAction exten
     } else if (obj instanceof IStringExpression) {
       return ((IStringExpression) obj).getStringValue(context, stream);
     }
-    return null;
+    return obj;
   }
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java Tue Mar 24 20:25:21 2020
@@ -60,6 +60,7 @@ public class ForEachBlock extends RutaBl
   @Override
   public ScriptApply apply(RutaStream stream, InferenceCrowd crowd) {
     BlockApply result = new BlockApply(this);
+    getEnvironment().ensureMaterializedInitialValues(new MatchContext(this), stream);
     crowd.beginVisit(this, result);
 
     setRuleElementAnchor();

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java Tue Mar 24 20:25:21 2020
@@ -28,6 +28,7 @@ import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.ScriptApply;
 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.RuleApply;
 import org.apache.uima.ruta.rule.RuleMatch;
 import org.apache.uima.ruta.rule.RutaMatcher;
@@ -46,6 +47,7 @@ public class RutaScriptBlock extends Rut
   @Override
   public ScriptApply apply(RutaStream stream, InferenceCrowd crowd) {
     BlockApply result = new BlockApply(this);
+    getEnvironment().ensureMaterializedInitialValues(new MatchContext(this), stream);
     crowd.beginVisit(this, result);
     RuleApply apply = rule.apply(stream, crowd, true);
     for (AbstractRuleMatch<? extends AbstractRule> eachMatch : apply.getList()) {

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java Tue Mar 24 20:25:21 2020
@@ -256,8 +256,13 @@ public class ConditionFactory {
 
   public AbstractRutaCondition createConditionParse(Token id, IStringExpression localeExpr,
           RutaBlock env) {
+    return createConditionParse(null, id, localeExpr, env);
+  }
+
+  public AbstractRutaCondition createConditionParse(IStringExpression se, Token id,
+          IStringExpression localeExpr, RutaBlock env) {
     String var = id == null ? "" : id.getText();
-    return new ParseCondition(var, localeExpr);
+    return new ParseCondition(se, var, localeExpr);
   }
 
   public AbstractRutaCondition createConditionIs(ITypeExpression type,

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContainsCondition.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContainsCondition.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContainsCondition.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContainsCondition.java Tue Mar 24 20:25:21 2020
@@ -135,7 +135,8 @@ public class ContainsCondition extends T
               && argList instanceof INumberListExpression) {
         INumberExpression e = (INumberExpression) arg;
         INumberListExpression le = (INumberListExpression) argList;
-        Number v = e.getDoubleValue(context, stream);
+        Double v = e.getDoubleValue(context, stream);
+        // TODO: this wont work for numbers yet!
         List<Number> l = new ArrayList<Number>(le.getNumberList(context, stream));
         while (l.remove(v)) {
           basicCount++;

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java Tue Mar 24 20:25:21 2020
@@ -34,17 +34,24 @@ import org.apache.uima.ruta.visitor.Infe
 
 public class ParseCondition extends AbstractRutaCondition {
 
+  private IStringExpression stringExpression;
+
   private final String var;
 
   private IStringExpression localeExpr;
 
   public ParseCondition(String var) {
-    super();
-    this.var = var;
+    this(null, var, null);
   }
 
   public ParseCondition(String var, IStringExpression localeExpr) {
+    this(null, var, localeExpr);
+  }
+
+  public ParseCondition(IStringExpression stringExpression, String var,
+          IStringExpression localeExpr) {
     super();
+    this.stringExpression = stringExpression;
     this.var = var;
     this.localeExpr = localeExpr;
   }
@@ -53,12 +60,17 @@ public class ParseCondition extends Abst
   public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
     AnnotationFS annotation = context.getAnnotation();
 
-    if (annotation == null) {
+    if (stringExpression == null && annotation == null) {
       return new EvaluatedCondition(this, false);
     }
 
     RuleElement element = context.getElement();
-    String text = annotation.getCoveredText();
+    String text = "";
+    if (stringExpression != null) {
+      text = stringExpression.getStringValue(context, stream);
+    } else {
+      text = annotation.getCoveredText();
+    }
     RutaEnvironment env = element.getParent().getEnvironment();
     Class<?> type = env.getVariableType(var);
     NumberFormat nf = null;

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java Tue Mar 24 20:25:21 2020
@@ -137,6 +137,10 @@ public class MatchReference extends Ruta
         features = tail;
       }
     }
+    if (featureExpression == null && comparator != null && argument != null) {
+      featureExpression = new FeatureMatchExpression(this, comparator, argument);
+    }
+
     initialized = true;
     if (typeExpression == null && typeListExpression == null && annotationExpression == null
             && annotationListExpression == null) {

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListFeatureExpression.java Tue Mar 24 20:25:21 2020
@@ -40,7 +40,7 @@ public class AnnotationListFeatureExpres
     super();
     this.fe = fe;
   }
-  
+
   @Override
   public List<AnnotationFS> getList(MatchContext context, RutaStream stream) {
     AnnotationFS annotation = context.getAnnotation();
@@ -58,9 +58,4 @@ public class AnnotationListFeatureExpres
     this.fe = fe;
   }
 
-
-
-  
-  
-
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java Tue Mar 24 20:25:21 2020
@@ -31,24 +31,21 @@ import org.apache.uima.ruta.rule.MatchCo
  */
 public class AnnotationListLabelExpression extends AbstractAnnotationListExpression {
 
-private String label;
-  
+  private String label;
+
   public AnnotationListLabelExpression(String label) {
     super();
     this.label = label;
   }
- 
+
   @SuppressWarnings("unchecked")
   @Override
   public List<AnnotationFS> getList(MatchContext context, RutaStream stream) {
     return context.getParent().getEnvironment().getVariableValue(label, List.class, stream);
   }
-  
+
   public String getLabel() {
     return label;
   }
 
-
- 
-
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListVariableExpression.java Tue Mar 24 20:25:21 2020
@@ -19,6 +19,7 @@
 
 package org.apache.uima.ruta.expression.annotation;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.uima.cas.text.AnnotationFS;
@@ -35,13 +36,20 @@ public class AnnotationListVariableExpre
     this.var = var;
   }
 
-  
   @Override
   public List<AnnotationFS> getList(MatchContext context, RutaStream stream) {
     RutaBlock parent = context.getParent();
-    @SuppressWarnings("unchecked")
-    List<AnnotationFS> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
-    return list;
+    List<?> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
+    List<AnnotationFS> result = new ArrayList<>();
+    for (Object each : list) {
+      if (each instanceof IAnnotationExpression) {
+        result.add(((IAnnotationExpression) each).getAnnotation(context, stream));
+      }
+      if (each instanceof AnnotationFS) {
+        result.add((AnnotationFS) each);
+      }
+    }
+    return result;
   }
 
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/AbstractBooleanListExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/AbstractBooleanListExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/AbstractBooleanListExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/AbstractBooleanListExpression.java Tue Mar 24 20:25:21 2020
@@ -25,8 +25,9 @@ import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.list.ListExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
-public abstract class AbstractBooleanListExpression extends ListExpression<Boolean> implements IBooleanListExpression{
-  
+public abstract class AbstractBooleanListExpression extends ListExpression<Boolean>
+        implements IBooleanListExpression {
+
   @Override
   public List<Boolean> getBooleanList(MatchContext context, RutaStream stream) {
     return getList(context, stream);

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListVariableExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListVariableExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListVariableExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListVariableExpression.java Tue Mar 24 20:25:21 2020
@@ -35,11 +35,10 @@ public class BooleanListVariableExpressi
     this.var = var;
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public List<Boolean> getList(MatchContext context, RutaStream stream) {
     RutaBlock parent = context.getParent();
-    List<Object> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
+    List<?> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
     List<Boolean> result = new ArrayList<Boolean>();
     for (Object each : list) {
       if (each instanceof IBooleanExpression) {
@@ -55,6 +54,4 @@ public class BooleanListVariableExpressi
     return var;
   }
 
-  
-
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListVariableExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListVariableExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListVariableExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListVariableExpression.java Tue Mar 24 20:25:21 2020
@@ -35,11 +35,10 @@ public class NumberListVariableExpressio
     this.var = var;
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public List<Number> getList(MatchContext context, RutaStream stream) {
     RutaBlock parent = context.getParent();
-    List<Object> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
+    List<?> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
     List<Number> result = new ArrayList<Number>();
     for (Object each : list) {
       if (each instanceof INumberExpression) {
@@ -55,4 +54,5 @@ public class NumberListVariableExpressio
   public String getVar() {
     return var;
   }
+
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/SimpleNumberListExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/SimpleNumberListExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/SimpleNumberListExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/SimpleNumberListExpression.java Tue Mar 24 20:25:21 2020
@@ -47,4 +47,5 @@ public class SimpleNumberListExpression
   public List<INumberExpression> getList() {
     return list;
   }
+
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/SimpleStringListExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/SimpleStringListExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/SimpleStringListExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/SimpleStringListExpression.java Tue Mar 24 20:25:21 2020
@@ -47,4 +47,5 @@ public class SimpleStringListExpression
   public List<IStringExpression> getList() {
     return list;
   }
+
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListVariableExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListVariableExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListVariableExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListVariableExpression.java Tue Mar 24 20:25:21 2020
@@ -35,11 +35,10 @@ public class StringListVariableExpressio
     this.var = var;
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public List<String> getList(MatchContext context, RutaStream stream) {
     RutaBlock parent = context.getParent();
-    List<Object> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
+    List<?> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
     List<String> result = new ArrayList<String>();
     for (Object each : list) {
       if (each instanceof AbstractStringExpression) {
@@ -56,5 +55,4 @@ public class StringListVariableExpressio
     return var;
   }
 
-  
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/SimpleTypeListExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/SimpleTypeListExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/SimpleTypeListExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/SimpleTypeListExpression.java Tue Mar 24 20:25:21 2020
@@ -47,4 +47,5 @@ public class SimpleTypeListExpression ex
   public List<ITypeExpression> getList() {
     return list;
   }
+
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java Tue Mar 24 20:25:21 2020
@@ -36,24 +36,23 @@ public class TypeListVariableExpression
     this.var = var;
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public List<Type> getList(MatchContext context, RutaStream stream) {
     RutaBlock parent = context.getParent();
-    List<Object> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
+    List<?> list = parent.getEnvironment().getVariableValue(var, List.class, stream);
     List<Type> result = new ArrayList<Type>();
     for (Object each : list) {
       if (each instanceof ITypeExpression) {
         result.add(((ITypeExpression) each).getType(context, stream));
       } else if (each instanceof Type) {
         result.add((Type) each);
-      } else if(each instanceof String) {
+      } else if (each instanceof String) {
         Type type = parent.getEnvironment().getType((String) each);
-        if(type != null) {
+        if (type != null) {
           result.add(type);
         } else {
-          throw new IllegalArgumentException("Not able to resolve type: " + each + 
-                  " in script " +context.getParent().getName());
+          throw new IllegalArgumentException("Not able to resolve type: " + each + " in script "
+                  + context.getParent().getName());
         }
       }
     }
@@ -64,5 +63,4 @@ public class TypeListVariableExpression
     return var;
   }
 
- 
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaLiteralMatcher.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaLiteralMatcher.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaLiteralMatcher.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaLiteralMatcher.java Tue Mar 24 20:25:21 2020
@@ -69,7 +69,6 @@ public class RutaLiteralMatcher implemen
 
   private AnnotationFS getAnnotation(int begin, int end, RutaStream stream) {
     RutaBasic beginAnchor = stream.getBeginAnchor(begin);
-
     if (beginAnchor != null && beginAnchor.getEnd() == end) {
       return beginAnchor;
     }
@@ -79,6 +78,7 @@ public class RutaLiteralMatcher implemen
       // unintended behavior
       return null;
     }
+
     CAS cas = stream.getCas();
     return cas.createAnnotation(cas.getAnnotationType(), begin, end);
   }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/NewCASPipelineTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/NewCASPipelineTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/NewCASPipelineTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/NewCASPipelineTest.java Tue Mar 24 20:25:21 2020
@@ -23,7 +23,6 @@ import static org.junit.Assert.assertEqu
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.uima.UIMAFramework;
 import org.apache.uima.analysis_engine.AnalysisEngine;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.cas.CAS;
@@ -31,7 +30,6 @@ import org.apache.uima.cas.Type;
 import org.apache.uima.fit.factory.AnalysisEngineFactory;
 import org.apache.uima.fit.factory.TypeSystemDescriptionFactory;
 import org.apache.uima.fit.pipeline.SimplePipeline;
-import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.metadata.ResourceMetaData;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 import org.apache.uima.ruta.engine.RutaEngine;
@@ -62,9 +60,7 @@ public class NewCASPipelineTest {
     ruta.getAnalysisEngineMetaData().getTypeSystem().addType(TEST_TYPE, "Type for Testing",
             "uima.tcas.Annotation");
 
-    ResourceManager resourceManager = UIMAFramework.newDefaultResourceManager();
-
-    return UIMAFramework.produceAnalysisEngine(ruta, resourceManager, null);
+    return AnalysisEngineFactory.createEngine(ruta);
   }
 
   @Test

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AddTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AddTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AddTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AddTest.java Tue Mar 24 20:25:21 2020
@@ -27,7 +27,7 @@ import org.junit.Test;
 public class AddTest {
 
   @Test
-  public void testAnnotations() {
+  public void testAnnotations() throws Exception {
     String document = "Some text.";
     String script = "";
     script += "ANNOTATION a;";
@@ -38,18 +38,32 @@ public class AddTest {
     script += "Document{SIZE(as,2,2)->T2};";
     script += "as{->T3};";
 
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.getCAS(document);
-      Ruta.apply(cas, script);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some text.");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some text.");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 2, "Some", "text");
+  }
+
+  @Test
+  public void testVariable() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "STRING s = \"a\";";
+    script += "STRINGLIST sl = {s};";
+    script += "Document{CONTAINS(sl, \"a\") -> T1};";
+    script += "Document{ -> ADD(sl, s)};";
+    script += "Document{ -> s = \"b\"};";
+    script += "Document{CONTAINS(sl, \"a\") -> T2};";
+    script += "Document{CONTAINS(sl, \"b\") -> T3};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
 
-    cas.release();
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "This is a test.");
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 0);
   }
 }

Added: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AssignActionTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AssignActionTest.java?rev=1875586&view=auto
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AssignActionTest.java (added)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/AssignActionTest.java Tue Mar 24 20:25:21 2020
@@ -0,0 +1,88 @@
+/*
+ * 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.uima.cas.CAS;
+import org.apache.uima.ruta.engine.Ruta;
+import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.junit.Test;
+
+public class AssignActionTest {
+
+  @Test
+  public void testBooleanListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "BOOLEANLIST bl;";
+    script += "ASSIGN(bl, {true});";
+    script += "Document{CONTAINS(bl, true) -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
+
+  @Test
+  public void testIntListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "INTLIST il;";
+    script += "ASSIGN(il, {1,2,3});";
+    script += "Document{CONTAINS(il, 2) -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
+
+  @Test
+  public void testStringListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "STRINGLIST sl;";
+    script += "ASSIGN(sl, {\"a\",\"b\"});";
+    script += "Document{CONTAINS(sl, \"a\") -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
+
+  @Test
+  public void testTypeListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "TYPELIST tl;";
+    script += "ASSIGN(tl, {CW, CAP});";
+    script += "Document{CONTAINS(tl, CW) -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
+}

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/ImplicitActionTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/ImplicitActionTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/ImplicitActionTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/ImplicitActionTest.java Tue Mar 24 20:25:21 2020
@@ -97,4 +97,63 @@ public class ImplicitActionTest {
     cas.release();
   }
 
+  @Test
+  public void testBooleanListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "BOOLEANLIST bl;";
+    script += "Document { -> bl = {true}};";
+    script += "Document{CONTAINS(bl, true) -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
+
+  @Test
+  public void testIntListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "INTLIST il;";
+    script += "Document { -> il = {1,2,3}};";
+    script += "Document{CONTAINS(il, 2) -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
+
+  @Test
+  public void testStringListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "STRINGLIST sl;";
+    script += "Document { -> sl = {\"a\",\"b\"}};";
+    script += "Document{CONTAINS(sl, \"a\") -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
+
+  @Test
+  public void testTypeListAssignment() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "TYPELIST tl;";
+    script += "Document { -> tl = {CW, CAP}};";
+    script += "Document{CONTAINS(tl, CW) -> T1};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+  }
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/InListTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/InListTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/InListTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/InListTest.java Tue Mar 24 20:25:21 2020
@@ -27,22 +27,14 @@ import org.junit.Test;
 public class InListTest {
 
   @Test
-  public void test() {
+  public void test() throws Exception {
     String name = this.getClass().getSimpleName();
     String namespace = this.getClass().getPackage().getName().replaceAll("\\.", "/");
-    
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.process(namespace + "/" + name + RutaEngine.SCRIPT_FILE_EXTENSION, namespace + "/" + name
-              + ".txt", 50, false, false, null, namespace + "/");
-    } catch (Exception e) {
-      e.printStackTrace();
-      assert (false);
-    }
+
+    CAS cas = RutaTestUtils.process(namespace + "/" + name + RutaEngine.SCRIPT_FILE_EXTENSION,
+            namespace + "/" + name + ".txt", 50, false, false, null, namespace + "/");
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "INLIST", "condition");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "INLIST");
-    
-    cas.release();
   }
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java Tue Mar 24 20:25:21 2020
@@ -19,42 +19,86 @@
 
 package org.apache.uima.ruta.condition;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
 import org.apache.uima.cas.CAS;
 import org.apache.uima.ruta.engine.Ruta;
 import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;
 import org.junit.Test;
 
 public class ParseTest {
 
   @Test
   public void test() {
-    
+
     CAS cas = RutaTestUtils.processTestScript(this.getClass());
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 5, "42", "2", "1", "2", "3");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "2,1", "2.3");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "true");
-    RutaTestUtils.assertAnnotationsEquals(cas, 4, 5, "A Boolean b that is true", "b = false", "The Number 42",
-            "The Double d = 2,1", "Another Double that is 2.3");
+    RutaTestUtils.assertAnnotationsEquals(cas, 4, 5, "A Boolean b that is true", "b = false",
+            "The Number 42", "The Double d = 2,1", "Another Double that is 2.3");
 
     cas.release();
   }
-  
+
   @Test
   public void testDecimal() throws Exception {
-    
+
     CAS cas = RutaTestUtils.getCAS("text 2.3 text 2,3 text");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d),d==2.3 -> T1};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"en\"),d==2.3 -> T2};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"de\"),d==2.3 -> T3};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"en\"),d!=2.3 -> T4};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"de\"),d!=2.3 -> T5};");
-    
+
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "2.3");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "2.3");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "2,3");
     RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "2,3");
     RutaTestUtils.assertAnnotationsEquals(cas, 5, 1, "2.3");
   }
-  
+
+  @Test
+  public void testParseStringExpression() throws Exception {
+
+    String script = "";
+    script += "DOUBLE d;\n";
+
+    script += "Document{PARSE(\"1\", d)};\n";
+    script += "Document{d == 1 -> T1};\n";
+
+    script += "Document{PARSE(\"1\" + \"1\", d)};\n";
+    script += "Document{d == 11 -> T2};\n";
+
+    script += "Document{-> s:Struct, s.s=\"3\"};\n";
+    script += "s:Struct{PARSE(s.s, d)};\n";
+    script += "Document{d == 3 -> T3};\n";
+
+    script += "n:NUM{PARSE(n.ct, d)};\n";
+    script += "Document{d == 5 -> T4};\n";
+
+    Map<String, String> complexTypes = new HashMap<String, String>();
+    Map<String, List<TestFeature>> features = new TreeMap<String, List<TestFeature>>();
+    String typeName = "Struct";
+    complexTypes.put(typeName, "uima.tcas.Annotation");
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    features.put(typeName, list);
+    list.add(new TestFeature("s", "", CAS.TYPE_NAME_STRING));
+    CAS cas = RutaTestUtils.getCAS("test 5", complexTypes, features);
+
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "test 5");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "test 5");
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "test 5");
+    RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "test 5");
+
+  }
+
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/NoSeedersTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/NoSeedersTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/NoSeedersTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/NoSeedersTest.java Tue Mar 24 20:25:21 2020
@@ -30,7 +30,7 @@ public class NoSeedersTest {
   public void test() throws Exception {
     CAS cas = RutaTestUtils.getCAS("This is a test.");
     JCas jcas = cas.getJCas();
-
+    
     String script = "";
     script += "\"This\"-> T1;";
     script += "\"is\"-> T2;";
@@ -41,12 +41,13 @@ public class NoSeedersTest {
     script += "T1{-> T7};";
     script += "T2 T3{-> T8};";
     script += "T1 # T4{-> T9};";
-
-    AnalysisEngine ae = AnalysisEngineFactory.createEngine(RutaEngine.class, RutaEngine.PARAM_RULES,
-            script, RutaEngine.PARAM_SEEDERS, new String[0]);
-
+    
+    AnalysisEngine ae = AnalysisEngineFactory.createEngine(RutaEngine.class, 
+            RutaEngine.PARAM_RULES, script,
+            RutaEngine.PARAM_SEEDERS, new String[0]);
+    
     ae.process(jcas);
-
+    
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "is", "is");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "a");
@@ -56,7 +57,7 @@ public class NoSeedersTest {
     RutaTestUtils.assertAnnotationsEquals(cas, 7, 1, "This");
     RutaTestUtils.assertAnnotationsEquals(cas, 8, 1, "a");
     RutaTestUtils.assertAnnotationsEquals(cas, 9, 1, "test");
-
+    
   }
-
+  
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/NullExpressionTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/NullExpressionTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/NullExpressionTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/NullExpressionTest.java Tue Mar 24 20:25:21 2020
@@ -33,7 +33,7 @@ import org.junit.Test;
 public class NullExpressionTest {
 
   @Test
-  public void test() {
+  public void test() throws Exception {
     String document = "Some text.";
     String script = "";
     script += "CREATE(A, \"a\" = \"test\", \"b\" = SW), CREATE(B, \"a\" = \"test\", \"b\" = SW);\n";
@@ -46,13 +46,12 @@ public class NullExpressionTest {
     script += "B{FEATURE(\"a\", null)-> T3};";
     script += "B{FEATURE(\"b\", null)-> T4};";
 
-    
     Map<String, String> typeMap = new TreeMap<String, String>();
     String typeName1 = "A";
     typeMap.put(typeName1, "uima.tcas.Annotation");
     String typeName2 = "B";
     typeMap.put(typeName2, "uima.tcas.Annotation");
-    
+
     Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
     List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
     featureMap.put(typeName1, list);
@@ -61,15 +60,9 @@ public class NullExpressionTest {
     list.add(new TestFeature(fn1, "", "uima.cas.String"));
     String fn2 = "b";
     list.add(new TestFeature(fn2, "", "uima.tcas.Annotation"));
-    
-    
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
-      Ruta.apply(cas, script);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+
+    CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+    Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some text.");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some text.");
@@ -78,6 +71,5 @@ public class NullExpressionTest {
     RutaTestUtils.assertAnnotationsEquals(cas, 5, 1, "Some text.");
     RutaTestUtils.assertAnnotationsEquals(cas, 6, 1, "Some text.");
 
-    cas.release();
   }
 }

Added: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/VariableInitialValueTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/VariableInitialValueTest.java?rev=1875586&view=auto
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/VariableInitialValueTest.java (added)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/VariableInitialValueTest.java Tue Mar 24 20:25:21 2020
@@ -0,0 +1,73 @@
+/*
+ * 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.CAS;
+import org.apache.uima.ruta.engine.Ruta;
+import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class VariableInitialValueTest {
+
+  @Test
+  public void testStringVariableAsInitialValueOfList() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "STRING s = \"a\";";
+    script += "STRINGLIST sl = {s};";
+    script += "Document{CONTAINS(sl, \"a\") -> T1};";
+    script += "Document{ -> s = \"b\"};";
+    script += "Document{CONTAINS(sl, \"a\") -> T2};";
+    script += "Document{CONTAINS(sl, \"b\") -> T3};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "This is a test.");
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 0);
+
+  }
+
+  @Test
+  @Ignore
+  public void testIntVariableAsInitialValueOfList() throws Exception {
+    String document = "This is a test.";
+
+    String script = "";
+    script += "INT i = 1;";
+    script += "INTLIST il = {i};";
+    script += "Document{CONTAINS(il, 1) -> T1};";
+    script += "Document{ -> i = 2};";
+    script += "Document{CONTAINS(il, 1) -> T2};";
+    script += "Document{CONTAINS(il, 2) -> T3};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "This is a test.");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "This is a test.");
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 0);
+
+  }
+
+}

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationVariableExpressionTest.java Tue Mar 24 20:25:21 2020
@@ -270,4 +270,25 @@ public class AnnotationVariableExpressio
 
   }
 
+  @Test
+  public void testCompareGlobalVariableInAction() throws Exception {
+
+    String document = "Some text.";
+    String script = "";
+    script += "ANNOTATION a1, a2;\n";
+    script += "BOOLEAN b1, b2;\n";
+    script += "d:Document{-> a1=d};\n";
+    script += "Document{-> b1 = a1==a2};\n";
+    script += "Document{-> b2 = a1!=a2};\n";
+    script += "Document{b1==false-> T1};\n";
+    script += "Document{b2==true -> T2};\n";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1);
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1);
+
+  }
+
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/LiteralStringMatchTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/LiteralStringMatchTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/LiteralStringMatchTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/LiteralStringMatchTest.java Tue Mar 24 20:25:21 2020
@@ -89,4 +89,18 @@ public class LiteralStringMatchTest {
             "colorectal, endometrial, and ovarian cancers.",
             "colorectal, endometrial and ovarian cancers.");
   }
-}
\ No newline at end of file
+
+  @Test
+  public void testMatcherCombination() throws Exception {
+    // see UIMA-6195
+    String document = "PI_____I How to test it?\nP I_____I How to test it?\n";
+    String script = "";
+    script += "\"____+\" -> T1;";
+    script += "\"I\" T1 \"I\"? { -> MARKONCE(T2,1,2)};";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "I_____");
+  }
+}

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/ManualAnchoringTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/ManualAnchoringTest.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/ManualAnchoringTest.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/ManualAnchoringTest.java Tue Mar 24 20:25:21 2020
@@ -33,34 +33,11 @@ public class ManualAnchoringTest {
     script += "CW{-> T1};\n";
     script += "\"and\"{-> T2};\n";
     script += "T1 (COMMA T1)* @T2 T1 {->MARK(T3,1,4)};\n";
-
     CAS cas = RutaTestUtils.getCAS(document);
     Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "A, B and C");
-  }
 
-  @Test
-  public void testInWindow() throws Exception {
-    String document = "A, B and C. A, B and C.";
-    String script = "";
-    script += "ANY+{-PARTOF({PERIOD,T1}) -> T1};\n";
-    script += "BLOCK(block) T1{}{\n";
-    script += "SW CW{-> T2};\n";
-    script += "SW @CW{-> T3};\n";
-    script += "}\n";
-    script += "T1->{\n";
-    script += "SW CW{-> T4};\n";
-    script += "SW @CW{-> T5};\n";
-    script += "};\n";
-
-    CAS cas = RutaTestUtils.getCAS(document);
-    Ruta.apply(cas, script);
-
-    RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "C", "C");
-    RutaTestUtils.assertAnnotationsEquals(cas, 3, 2, "C", "C");
-    RutaTestUtils.assertAnnotationsEquals(cas, 4, 2, "C", "C");
-    RutaTestUtils.assertAnnotationsEquals(cas, 5, 2, "C", "C");
+    cas.release();
   }
-
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/RuleInference3Test.java
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/RuleInference3Test.java?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/RuleInference3Test.java (original)
+++ uima/uv3/ruta-v3/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/RuleInference3Test.java Tue Mar 24 20:25:21 2020
@@ -31,5 +31,6 @@ public class RuleInference3Test {
     CAS cas = RutaTestUtils.processTestScript(this.getClass());
 
     RutaTestUtils.assertAnnotationsEquals(cas, 4, 4, "[1]", "[2]", "[3]", "[4]");
+
   }
 }

Modified: uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.howtos.xml
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.howtos.xml?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.howtos.xml (original)
+++ uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.howtos.xml Tue Mar 24 20:25:21 2020
@@ -250,7 +250,7 @@ The|DT rabbit|NN made|VBD up|RP this|DT
 		<programlisting><![CDATA[<plugin>
 <groupId>org.apache.uima</groupId>
 <artifactId>ruta-maven-plugin</artifactId>
-<version>3.0.0</version>
+<version>3.0.1</version>
 <configuration>
 
  <!-- This is a exemplary configuration, which explicitly specifies the 
@@ -403,7 +403,7 @@ The|DT rabbit|NN made|VBD up|RP this|DT
     <programlisting><![CDATA[<plugin>
 <groupId>org.apache.uima</groupId>
 <artifactId>ruta-maven-plugin</artifactId>
-<version>3.0.0</version>
+<version>3.0.1</version>
 <configuration></configuration>
 <executions>
 <execution>
@@ -456,7 +456,7 @@ The|DT rabbit|NN made|VBD up|RP this|DT
     <programlisting><![CDATA[<plugin>
 <groupId>org.apache.uima</groupId>
 <artifactId>ruta-maven-plugin</artifactId>
-<version>3.0.0</version>
+<version>3.0.1</version>
 <configuration></configuration>
 <executions>
 <execution>
@@ -527,7 +527,7 @@ The|DT rabbit|NN made|VBD up|RP this|DT
     </para>  
     
     <programlisting><![CDATA[mvn archetype:generate -DarchetypeGroupId=org.apache.uima 
-    -DarchetypeArtifactId=ruta-maven-archetype -DarchetypeVersion=3.0.0
+    -DarchetypeArtifactId=ruta-maven-archetype -DarchetypeVersion=3.0.1
     -DgroupId=my.domain -DartifactId=my-ruta-project]]></programlisting>
     
     <para>

Modified: uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml (original)
+++ uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml Tue Mar 24 20:25:21 2020
@@ -606,19 +606,20 @@
     <title>PARSE</title>
     <para>
       The PARSE condition is fulfilled, if the text covered by the
-      matched annotation can be transformed into a value of the given
+      matched annotation or the text defined by a optional first argument can be transformed into a value of the given
       variable's type. If this is possible, the parsed value is
       additionally assigned to the passed variable. For numeric values,
       this conditions delegates to the NumberFormat of the locale given by the optional
-      second argument. Therefore, this condition parses the string <quote>2,3</quote> for the locale
+      last argument. Therefore, this condition parses the string <quote>2,3</quote> for the locale
       <quote>en</quote> to the value 23.
+      
     </para>
     <section>
       <title>
         <emphasis role="bold">Definition:</emphasis>
       </title>
       <para>
-        <programlisting><![CDATA[PARSE(variable(, stringExpression)?)]]></programlisting>
+        <programlisting><![CDATA[PARSE((stringExpression,)? variable(, stringExpression)?)]]></programlisting>
       </para>
     </section>
     <section>
@@ -626,7 +627,8 @@
         <emphasis role="bold">Example:</emphasis>
       </title>
       <para>
-        <programlisting><![CDATA[NUM{PARSE(var,"de")};]]></programlisting>
+        <programlisting><![CDATA[NUM{PARSE(var,"de")};
+n:NUM{PARSE(n.ct,var,"de")};]]></programlisting>
       </para>
       <para>
         If the variable 'var' is of an appropriate numeric type for the locale "de", the

Modified: uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.expressions.xml
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.expressions.xml?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.expressions.xml (original)
+++ uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.expressions.xml Tue Mar 24 20:25:21 2020
@@ -19,8 +19,8 @@
 <section id="ugr.tools.ruta.language.expressions">
   <title>Expressions</title>
   <para>
-    UIMA Ruta provides five different kinds of expressions. These are
-    type expressions, number expressions, string expressions,
+    UIMA Ruta provides six different kinds of expressions. These are
+    type expressions, annotations expressions, number expressions, string expressions,
     boolean expressions and list expressions.
   </para>
   <para>

Modified: uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.xml
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.xml?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.xml (original)
+++ uima/uv3/ruta-v3/trunk/ruta-docbook/src/docbook/tools.ruta.language.xml Tue Mar 24 20:25:21 2020
@@ -899,7 +899,7 @@ WORDTABLE presidentsOfUSA = "" + package
 ]]></programlisting>
       </para>
       <para>
-        By default, whitespaces are removed by the activated parameter <quote>dictRemoveWS</quote> 
+        By default, whitespaces are removed by activating the parameter <quote>dictRemoveWS</quote> 
         for WORDLIST and WORDTABLE when the dictionary is loaded. In the special case when whitespace are relevant, e.g., 
         specific patterns of whitespaces need to be detected by the dictionary lookup, 
         then the analysis engine needs to be configured differently. 

Modified: uima/uv3/ruta-v3/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/uv3/ruta-v3/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1875586&r1=1875585&r2=1875586&view=diff
==============================================================================
--- uima/uv3/ruta-v3/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original)
+++ uima/uv3/ruta-v3/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Tue Mar 24 20:25:21 2020
@@ -1450,10 +1450,20 @@ conditionFeature returns [RutaCondition
     RPAREN
     ;   
 conditionParse returns [RutaCondition cond = null]
+  options {
+	backtrack = true;
+}
     :
     name = PARSE LPAREN
-     var=genericVariableReference (COMMA locale = stringExpression)?
+    (
+    se=stringExpression COMMA
+    var=genericVariableReference (COMMA locale = stringExpression)?
+    {cond = ConditionFactory.createCondition(name, se, var, locale);}
+    |
+    var=genericVariableReference (COMMA locale = stringExpression)?
     {cond = ConditionFactory.createCondition(name, var, locale);}
+    )
+   
     RPAREN
     ;