Author: pkluegl
Date: Fri Feb 24 15:45:45 2017
New Revision: 1784287

URL: http://svn.apache.org/viewvc?rev=1784287&view=rev
Log:
UIMA-5332 + UIMA-5331
- adapt grammars and inference
UIMA-5219
- prepare

Added:
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java
   (with props)
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java
   (with props)
    
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
   (with props)
    
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java
   (with props)
    
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ConditionedAnnotationTypeExpression.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/RutaScriptFactory.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.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/feature/GenericFeatureExpression.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java
    
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpressionTest.java
    uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml
    uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.overview.xml
    
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
    
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java

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=1784287&r1=1784286&r2=1784287&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
 Fri Feb 24 15:45:45 2017
@@ -106,7 +106,6 @@ import org.apache.uima.ruta.rule.quantif
 @parser::members {
 private List vars = new ArrayList();   
 private int level = 0;
-private RutaScriptFactory factory = new RutaScriptFactory();
 private RutaExternalFactory external;
 private String namespace;
 private String moduleName;
@@ -114,7 +113,16 @@ private ResourceManager resourceManager;
 private UimaContext context;
 
 private RutaDescriptorInformation descInfo;
+private ExpressionFactory expressionFactory;
+private RutaScriptFactory factory;
 
+public void setScriptFactory(RutaScriptFactory factory) {
+       this.factory = factory;
+}
+
+public void setExpressionFactory(ExpressionFactory factory) {
+       this.expressionFactory = factory;
+}
 
 public void setDescriptorInformation(RutaDescriptorInformation descInfo) {
   this.descInfo = descInfo;  
@@ -133,7 +141,6 @@ public void setExternalFactory(RutaExter
 }
        public void setContext(UimaContext context){
            this.context = context;
-           factory.setContext(context);
        }
 
        public void emitErrorMessage(String msg) {
@@ -1032,21 +1039,21 @@ ruleElementMatchPart [RuleElementContain
        (
     (annotationAddressExpression)=>addressExpr = annotationAddressExpression 
      {
-            MatchReference mr = 
ExpressionFactory.createMatchReference(addressExpr);
+            MatchReference mr = 
expressionFactory.createMatchReference(addressExpr);
             re = factory.createRuleElement(mr, container, 
$blockDeclaration::env);
      } 
      
     |
     (typeFunction)=> tf = typeFunction 
     {
-       MatchReference mr = ExpressionFactory.createMatchReference(tf);
+       MatchReference mr = expressionFactory.createMatchReference(tf);
        re = factory.createRuleElement(mr, container, $blockDeclaration::env);
     }
     
     |
      match = dottedIdWithIndex2 ((comp = LESS | comp = GREATER | comp = 
GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = 
argument)?
      {
-            MatchReference mr = ExpressionFactory.createMatchReference(match, 
comp, arg);
+            MatchReference mr = expressionFactory.createMatchReference(match, 
comp, arg);
             re = factory.createRuleElement(mr, container, 
$blockDeclaration::env);
      }
      
@@ -1110,7 +1117,7 @@ rawActions returns [List<AbstractRutaAct
 
 listExpression returns [ListExpression expr = null]
        :
-       (featureExpression)=>fe = featureExpression {expr = 
ExpressionFactory.createGenericFeatureExpression(fe);}
+       (featureExpression)=>fe = featureExpression {expr = 
expressionFactory.createGenericFeatureExpression(fe);}
        | (booleanListExpression)=> bl = booleanListExpression {expr = bl;}
        | (intListExpression)=> il = intListExpression {expr = il;}
        | (doubleListExpression)=> dl = doubleListExpression {expr = dl;}
@@ -1138,7 +1145,7 @@ untypedListExpression returns [ListExpre
        List<IRutaExpression> list = new ArrayList<IRutaExpression>();
 }      :
        LCURLY (e = argument {list.add(e);} (COMMA e = argument 
{list.add(e);})*)?  RCURLY
-       {expr = ExpressionFactory.createUntypedListExpression(list);}
+       {expr = expressionFactory.createUntypedListExpression(list);}
        ;
 
 booleanListExpression returns [AbstractBooleanListExpression expr = null]
@@ -1151,10 +1158,10 @@ simpleBooleanListExpression returns [Abs
        List<IBooleanExpression> list = new ArrayList<IBooleanExpression>();
 }      :
        LCURLY (e = simpleBooleanExpression {list.add(e);} (COMMA e = 
simpleBooleanExpression {list.add(e);})*)?  RCURLY
-       {expr = ExpressionFactory.createBooleanListExpression(list);}
+       {expr = expressionFactory.createBooleanListExpression(list);}
        |
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"BOOLEANLIST")}? var = Identifier 
-       {expr = ExpressionFactory.createReferenceBooleanListExpression(var);}
+       {expr = expressionFactory.createReferenceBooleanListExpression(var);}
        ;
 
 
@@ -1168,10 +1175,10 @@ simpleIntListExpression returns [Abstrac
        List<INumberExpression> list = new ArrayList<INumberExpression>();
 }      :
        LCURLY (e = simpleNumberExpression {list.add(e);} (COMMA e = 
simpleNumberExpression {list.add(e);})*)?  RCURLY
-       {expr = ExpressionFactory.createNumberListExpression(list);}
+       {expr = expressionFactory.createNumberListExpression(list);}
        |
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"INTLIST")}? var = Identifier 
-       {expr = ExpressionFactory.createReferenceIntListExpression(var);}
+       {expr = expressionFactory.createReferenceIntListExpression(var);}
        ;
 
 
@@ -1194,10 +1201,10 @@ simpleDoubleListExpression returns [Abst
        List<INumberExpression> list = new ArrayList<INumberExpression>();
 }      :
        LCURLY (e = simpleNumberExpression {list.add(e);} (COMMA e = 
simpleNumberExpression {list.add(e);})*)?  RCURLY
-       {expr = ExpressionFactory.createNumberListExpression(list);}
+       {expr = expressionFactory.createNumberListExpression(list);}
        |
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"DOUBLELIST")}? var = Identifier 
-       {expr = ExpressionFactory.createReferenceDoubleListExpression(var);}
+       {expr = expressionFactory.createReferenceDoubleListExpression(var);}
        ;
 
        
@@ -1211,10 +1218,10 @@ simpleFloatListExpression returns [Abstr
        List<INumberExpression> list = new ArrayList<INumberExpression>();
 }      :
        LCURLY (e = simpleNumberExpression {list.add(e);} (COMMA e = 
simpleNumberExpression {list.add(e);})*)?  RCURLY
-       {expr = ExpressionFactory.createNumberListExpression(list);}
+       {expr = expressionFactory.createNumberListExpression(list);}
        |
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"FLOATLIST")}? var = Identifier 
-       {expr = ExpressionFactory.createReferenceFloatListExpression(var);}
+       {expr = expressionFactory.createReferenceFloatListExpression(var);}
        ;
 
 stringListExpression returns [AbstractStringListExpression expr = null]
@@ -1227,10 +1234,10 @@ simpleStringListExpression returns [Abst
        List<IStringExpression> list = new ArrayList<IStringExpression>();
 }      :
        LCURLY (e = simpleStringExpression {list.add(e);} (COMMA e = 
simpleStringExpression {list.add(e);})*)?  RCURLY
-       {expr = ExpressionFactory.createStringListExpression(list);}    
+       {expr = expressionFactory.createStringListExpression(list);}    
        |
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"STRINGLIST")}? var = Identifier 
-       {expr = ExpressionFactory.createReferenceStringListExpression(var);}
+       {expr = expressionFactory.createReferenceStringListExpression(var);}
        ;
 
 
@@ -1244,10 +1251,10 @@ simpleTypeListExpression returns [Abstra
        List<ITypeExpression> list = new ArrayList<ITypeExpression>();
 }      :
        LCURLY (e = simpleTypeExpression {list.add(e);} (COMMA e = 
simpleTypeExpression {list.add(e);})*)?  RCURLY
-       {expr = ExpressionFactory.createTypeListExpression(list);}
+       {expr = expressionFactory.createTypeListExpression(list);}
        |
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"TYPELIST")}? var = Identifier 
-       {expr = ExpressionFactory.createReferenceTypeListExpression(var);}
+       {expr = expressionFactory.createReferenceTypeListExpression(var);}
        ;
 
 typeMatchExpression returns [IRutaExpression expr = null]
@@ -1263,7 +1270,7 @@ options {
 matchReference returns [MatchReference mr = null]
        :
        ref = dottedId 
-       {mr = ExpressionFactory.createMatchReference(ref);}
+       {mr = expressionFactory.createMatchReference(ref);}
        ;
 
 typeExpression returns [ITypeExpression type = null]
@@ -1272,7 +1279,7 @@ options {
 }
        :
        tf = typeFunction {type = tf;}
-       //| tl = typeListExpression LBRACK index = numberExpression RBRACK 
{type = ExpressionFactory.createTypeListIndexExpression(tl, index);}
+       //| tl = typeListExpression LBRACK index = numberExpression RBRACK 
{type = expressionFactory.createTypeListIndexExpression(tl, index);}
        | st = simpleTypeExpression {type = st;}
        ;
        
@@ -1297,17 +1304,17 @@ externalTypeFunction returns [ITypeExpre
 simpleTypeExpression returns [ITypeExpression type = null]
        :
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"TYPE")}? var = Identifier 
-       {type = ExpressionFactory.createReferenceTypeExpression(var);}
+       {type = expressionFactory.createReferenceTypeExpression(var);}
        |
        at = annotationType
-       {type = ExpressionFactory.createSimpleTypeExpression(at, 
$blockDeclaration::env);}
+       {type = expressionFactory.createSimpleTypeExpression(at, 
$blockDeclaration::env);}
        ;
 
 
 matchExpression returns [FeatureExpression feat = null]
        :
        match = dottedId
-       {MatchReference mr = ExpressionFactory.createMatchReference(match);}
+       {MatchReference mr = expressionFactory.createMatchReference(match);}
        ;
 
 featureExpression returns [FeatureExpression feat = null]
@@ -1318,8 +1325,8 @@ ITypeExpression te = null;
        :
        match = dottedIdWithIndex 
        {
-       MatchReference mr = ExpressionFactory.createMatchReference(match);
-       feat = ExpressionFactory.createFeatureExpression(mr, 
$blockDeclaration::env);
+       MatchReference mr = expressionFactory.createMatchReference(match);
+       feat = expressionFactory.createFeatureExpression(mr, 
$blockDeclaration::env);
        }
        ;
 
@@ -1327,11 +1334,11 @@ featureMatchExpression returns [FeatureE
        :
        match = dottedIdWithIndex ((comp = LESS | comp = GREATER | comp = 
GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = 
argument)?
        {
-       MatchReference mr = ExpressionFactory.createMatchReference(match);
+       MatchReference mr = expressionFactory.createMatchReference(match);
        if(comp != null) {
-       fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, 
$blockDeclaration::env);
+       fme = expressionFactory.createFeatureMatchExpression(mr, comp, arg, 
$blockDeclaration::env);
        } else {
-       fme = ExpressionFactory.createFeatureExpression(mr, 
$blockDeclaration::env);
+       fme = expressionFactory.createFeatureExpression(mr, 
$blockDeclaration::env);
        }
        }
        ;
@@ -1340,8 +1347,8 @@ featureMatchExpression2 returns [Feature
        :
        match = dottedIdWithIndex (comp = LESS | comp = GREATER | comp = 
GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = argument
        {
-       MatchReference mr = ExpressionFactory.createMatchReference(match);
-       fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, 
$blockDeclaration::env);}
+       MatchReference mr = expressionFactory.createMatchReference(match);
+       fme = expressionFactory.createFeatureMatchExpression(mr, comp, arg, 
$blockDeclaration::env);}
        ;
 
 
@@ -1349,8 +1356,8 @@ featureAssignmentExpression returns [Fea
        :
        match = dottedIdWithIndex op = ASSIGN_EQUAL arg = argument
        {
-       MatchReference mr = ExpressionFactory.createMatchReference(match);
-       fme = ExpressionFactory.createFeatureMatchExpression(mr, op, arg, 
$blockDeclaration::env);
+       MatchReference mr = expressionFactory.createMatchReference(match);
+       fme = expressionFactory.createFeatureMatchExpression(mr, op, arg, 
$blockDeclaration::env);
        }
        ;
        
@@ -1384,14 +1391,14 @@ listVariable returns [Token var = null]
 //@init {List<ITypeExpression> exprs = new ArrayList<ITypeExpression>();}
 //     :
 //     LBRACK e = typeExpressionAnd{exprs.add(e);} ( COMMA e = 
typeExpressionAnd{exprs.add(e);} )* RBRACK
-//     {type = ExpressionFactory.createOrTypeExpression(exprs);}
+//     {type = expressionFactory.createOrTypeExpression(exprs);}
 //     ;
 
 //typeExpressionAnd returns [ITypeExpression type = null]
 //@init {List<ITypeExpression> exprs = new ArrayList<ITypeExpression>();}
 //     :
 //     LBRACK e = simpleTypeExpression{exprs.add(e);} ( SEMI e = 
simpleTypeExpression{exprs.add(e);} )* RBRACK
-//     {type = ExpressionFactory.createAndTypeExpression(exprs);}
+//     {type = expressionFactory.createAndTypeExpression(exprs);}
 //     ;
 
 quantifierPart returns [RuleElementQuantifier quantifier = null]
@@ -2315,14 +2322,26 @@ options {
        backtrack = true;
 }
        :
-       (featureExpression)=> fe = featureExpression {expr = 
ExpressionFactory.createGenericFeatureExpression(fe);}
+       match = dottedIdWithIndex2 (comp = LESS | comp = GREATER | comp = 
GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = 
argument LCURLY cs = conditions RCURLY
+       {MatchReference mr = expressionFactory.createMatchReference(match, 
comp, arg);
+       expr = 
expressionFactory.createConditionedAnnotationTypeExpression(mr,cs);}
+       | match = dottedIdWithIndex2 LCURLY cs = conditions RCURLY
+       {MatchReference mr = expressionFactory.createMatchReference(match);
+       expr = 
expressionFactory.createConditionedAnnotationTypeExpression(mr,cs);}
+       | match = dottedIdWithIndex2 (comp = LESS | comp = GREATER | comp = 
GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = argument
+       {MatchReference mr = expressionFactory.createMatchReference(match, 
comp, arg);
+       expr = expressionFactory.createAnnotationTypeExpression(mr);}
+
+       | (featureExpression)=> fe = featureExpression {expr = 
expressionFactory.createGenericFeatureExpression(fe);}
        | a2 = booleanExpression {expr = a2;}
        | a3 = numberExpression {expr = a3;}
        | a4 = stringExpression {expr = a4;}
        | (listExpression)=> l = listExpression {expr = l;}
        | a5 = nullExpression {expr = a5;}
        | a6 = annotationOrTypeExpression {expr = a6;}
-       //| a1 = typeExpression {expr = a1;}
+       //| match = dottedIdWithIndex2 ((comp = LESS | comp = GREATER | comp = 
GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = 
argument)?
+       //{MatchReference mr = expressionFactory.createMatchReference(match, 
comp, arg);
+       //expr = expressionFactory.createAnnotationTypeExpression(mr);}
        
        //(a2 = booleanExpression)=> a2 = booleanExpression {expr = a2;}
        //| (a3 = numberExpression)=> a3 = numberExpression {expr = a3;}
@@ -2330,6 +2349,20 @@ options {
        //| (a1 = typeExpression)=> a1 = typeExpression {expr = a1;}
        ;
 
+simpleArgument returns [IRutaExpression expr = null]
+options {
+       backtrack = true;
+}
+       :
+       (featureExpression)=> fe = featureExpression {expr = 
expressionFactory.createGenericFeatureExpression(fe);}
+       | a2 = booleanExpression {expr = a2;}
+       | a3 = numberExpression {expr = a3;}
+       | a4 = stringExpression {expr = a4;}
+       | (listExpression)=> l = listExpression {expr = l;}
+       | a5 = nullExpression {expr = a5;}
+       ;
+
+
 annotationOrTypeExpression returns [IRutaExpression expr = null]
        :
        aae = annotationAddressExpression {expr = aae;}
@@ -2338,14 +2371,17 @@ annotationOrTypeExpression returns [IRut
        |
        af = annotationFunction {expr = af;}    
        |
-       ref = dottedId
-       {expr = ExpressionFactory.createGenericExpression(ref);}
+       match = dottedIdWithIndex2 ((comp = LESS | comp = GREATER | comp = 
GREATEREQUAL | comp = LESSEQUAL |comp =  EQUAL | comp = NOTEQUAL) arg = 
argument)?
+       {MatchReference mr = expressionFactory.createMatchReference(match, 
comp, arg);
+       expr = expressionFactory.createAnnotationTypeExpression(mr);}
+       //ref = dottedId
+       //{expr = expressionFactory.createGenericExpression(ref);}
        ;
 
 annotationExpression returns [IRutaExpression expr = null]
        :
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"ANNOTATION")   }? 
-       id = Identifier {expr = 
ExpressionFactory.createAnnotationVariableExpression(id);} 
+       id = Identifier {expr = 
expressionFactory.createAnnotationVariableExpression(id);} 
        |
        //(annotationListIndexExpression)=> alie = 
annotationListIndexExpression {expr = alie;}
        //|
@@ -2359,24 +2395,24 @@ annotationExpression returns [IRutaExpre
 
 annotationListIndexExpression returns [IRutaExpression expr = null]
        :
-       al = annotationListExpression LBRACK index = numberExpression RBRACK 
{expr = ExpressionFactory.createAnnotationListIndexExpression(al, index);}
+       al = annotationListExpression LBRACK index = numberExpression RBRACK 
{expr = expressionFactory.createAnnotationListIndexExpression(al, index);}
        ;
 
 annotationListExpression returns [AbstractAnnotationListExpression expr = null]
        :
        {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"ANNOTATIONLIST")}? 
-       id = Identifier {expr = 
ExpressionFactory.createAnnotationListVariableExpression(id);} 
+       id = Identifier {expr = 
expressionFactory.createAnnotationListVariableExpression(id);} 
        ;
        
 
 annotationAddressExpression returns [IAnnotationExpression expr = null]
        :
-       ADDRESS_PREFIX address = DecimalLiteral {expr = 
ExpressionFactory.createAnnotationAddressExpression(address);}
+       ADDRESS_PREFIX address = DecimalLiteral {expr = 
expressionFactory.createAnnotationAddressExpression(address);}
        ;
        
 annotationLabelExpression returns [IRutaExpression expr = null]
        :
-       label = Identifier {expr = 
ExpressionFactory.createAnnotationLabelExpression(label);}
+       label = Identifier {expr = 
expressionFactory.createAnnotationLabelExpression(label);}
        ;
 
 annotationFunction returns [IAnnotationExpression expr = null]
@@ -2396,7 +2432,7 @@ externalAnnotationFunction returns [IAnn
 
 nullExpression returns [IRutaExpression expr = null]
        :
-       NULL {expr = ExpressionFactory.createNullExpression();}
+       NULL {expr = expressionFactory.createNullExpression();}
        ;
 
 
@@ -2510,19 +2546,19 @@ List<IStringExpression> args = new Array
 }
        :
        RESOURCE LPAREN name = dottedId (COMMA arg = stringExpression 
{args.add(arg);} )* RPAREN
-       {expr = ExpressionFactory.createExternalWordListExpression(name, args);}
+       {expr = expressionFactory.createExternalWordListExpression(name, args);}
        |
        path = RessourceLiteral
-       {expr = ExpressionFactory.createLiteralWordListExpression(path);}
+       {expr = expressionFactory.createLiteralWordListExpression(path);}
        |
        id = Identifier
-       {expr = ExpressionFactory.createReferenceWordListExpression(id);}
+       {expr = expressionFactory.createReferenceWordListExpression(id);}
        ;
 
 wordListOrStringExpression returns [WordListExpression expr = null]
        :
        (stringExpression)=> string = stringExpression
-       {expr = ExpressionFactory.createStringWordListExpression(string);}
+       {expr = expressionFactory.createStringWordListExpression(string);}
        |       
        e = wordListExpression
        {expr = e;}
@@ -2534,19 +2570,19 @@ List<IStringExpression> args = new Array
 }
        :
        RESOURCE LPAREN name = dottedId (COMMA arg = stringExpression 
{args.add(arg);} )* RPAREN
-       {expr = ExpressionFactory.createExternalWordTableExpression(name, 
args);}
+       {expr = expressionFactory.createExternalWordTableExpression(name, 
args);}
        |
        path = RessourceLiteral
-       {expr = ExpressionFactory.createLiteralWordTableExpression(path);}
+       {expr = expressionFactory.createLiteralWordTableExpression(path);}
        |
        id = Identifier
-       {expr = ExpressionFactory.createReferenceWordTableExpression(id);}
+       {expr = expressionFactory.createReferenceWordTableExpression(id);}
        ;
 
 wordTableOrStringExpression returns [WordTableExpression expr = null]
        :
        (stringExpression)=>string = stringExpression
-       {expr = ExpressionFactory.createStringWordTableExpression(string);}
+       {expr = expressionFactory.createStringWordTableExpression(string);}
        |       
        e = wordTableExpression
        {expr = e;}
@@ -2557,10 +2593,10 @@ wordTableOrStringExpression returns [Wor
 numberFunction returns [INumberExpression expr = null]
        :
        (op=(EXP | LOGN | SIN | COS | TAN ) numExprP=numberExpressionInPar)
-       {expr = ExpressionFactory.createComposedNumberExpression(numExprP,op);}
+       {expr = expressionFactory.createComposedNumberExpression(numExprP,op);}
        | op = POW LPAREN n1 = numberExpression COMMA n2 = numberExpression 
RPAREN
-       {expr = ExpressionFactory.createComposedNumberExpression(n1,op, n2);}
-       //| {root = ExpressionFactory.createNumberFunction(numExprP,op)}
+       {expr = expressionFactory.createComposedNumberExpression(n1,op, n2);}
+       //| {root = expressionFactory.createNumberFunction(numExprP,op)}
        | (e = externalNumberFunction)=> e = externalNumberFunction {expr = e;}
        ;
 
@@ -2589,7 +2625,7 @@ additiveExpression returns [INumberExpre
        List<Token> ops = new ArrayList<Token>();}
        :   
        e = multiplicativeExpression{exprs.add(e);} ((PLUS | MINUS)=> op = 
(PLUS | MINUS){ops.add(op);} e = multiplicativeExpression{exprs.add(e);} )*
-       {expr = ExpressionFactory.createComposedNumberExpression(exprs,ops);}
+       {expr = expressionFactory.createComposedNumberExpression(exprs,ops);}
        ;
 
 multiplicativeExpression returns [INumberExpression expr = null]
@@ -2597,8 +2633,8 @@ multiplicativeExpression returns [INumbe
        List<Token> ops = new ArrayList<Token>();}
        :       
        (e = simpleNumberExpression{exprs.add(e);} (( STAR | SLASH | PERCENT 
)=> op = ( STAR | SLASH | PERCENT ){ops.add(op);} e = 
simpleNumberExpression{exprs.add(e);} )*     
-       {expr = ExpressionFactory.createComposedNumberExpression(exprs,ops);}
-       //| nl = numberListExpression LBRACK index = numberExpression RBRACK 
{expr = ExpressionFactory.createNumberListIndexExpression(nl, index);}
+       {expr = expressionFactory.createComposedNumberExpression(exprs,ops);}
+       //| nl = numberListExpression LBRACK index = numberExpression RBRACK 
{expr = expressionFactory.createNumberListIndexExpression(nl, index);}
        |   e1 = numberFunction {expr = e1;})
        ;
 
@@ -2614,11 +2650,11 @@ numberExpressionInPar returns [INumberEx
 
 simpleNumberExpression returns [INumberExpression expr = null]
        :
-       (featureExpression)=> fe = featureExpression {expr = 
ExpressionFactory.createNumberFeatureExpression(fe);}      
-       | m = MINUS? lit = DecimalLiteral {expr = 
ExpressionFactory.createIntegerExpression(lit,m);} 
+       (featureExpression)=> fe = featureExpression {expr = 
expressionFactory.createNumberFeatureExpression(fe);}      
+       | m = MINUS? lit = DecimalLiteral {expr = 
expressionFactory.createIntegerExpression(lit,m);} 
        // TODO what about float numbers?
-       | m = MINUS? lit = FloatingPointLiteral {expr = 
ExpressionFactory.createDoubleExpression(lit,m);}
-       | m = MINUS? var = numberVariable {expr = 
ExpressionFactory.createReferenceNumberExpression(var,m);}
+       | m = MINUS? lit = FloatingPointLiteral {expr = 
expressionFactory.createDoubleExpression(lit,m);}
+       | m = MINUS? var = numberVariable {expr = 
expressionFactory.createReferenceNumberExpression(var,m);}
        | e = numberExpressionInPar {expr = e;}
        ;
        
@@ -2630,15 +2666,15 @@ options {
 List<IStringExpression> exprs = new ArrayList<IStringExpression>();
 }
        :
-       (featureExpression)=> fe = featureExpression {expr = 
ExpressionFactory.createStringFeatureExpression(fe);}
-       //|(stringListExpression)=> sl = stringListExpression LBRACK index = 
numberExpression RBRACK {expr = 
ExpressionFactory.createStringListIndexExpression(sl, index);}
+       (featureExpression)=> fe = featureExpression {expr = 
expressionFactory.createStringFeatureExpression(fe);}
+       //|(stringListExpression)=> sl = stringListExpression LBRACK index = 
numberExpression RBRACK {expr = 
expressionFactory.createStringListIndexExpression(sl, index);}
        | e = simpleStringExpression {exprs.add(e);} 
        ((PLUS)=>PLUS (
                (numberExpressionInPar)=> e2 = numberExpressionInPar 
{exprs.add(e2);}
-               | arg = argument {if(arg instanceof IStringExpression) 
{exprs.add((IStringExpression)arg);}}
+               | arg = simpleArgument {if(arg instanceof IStringExpression) 
{exprs.add((IStringExpression)arg);}}
                //| le = listExpression {exprs.add(le);}
                ))*
-       {expr = ExpressionFactory.createComposedStringExpression(exprs);}
+       {expr = expressionFactory.createComposedStringExpression(exprs);}
        |(e = stringFunction)=> e = stringFunction{expr = e;} 
        ;
 
@@ -2665,24 +2701,24 @@ externalStringFunction returns [IStringE
 
 simpleStringExpression returns [IStringExpression expr = null]
        : 
-       lit = StringLiteral {expr = 
ExpressionFactory.createSimpleStringExpression(lit);} 
-       | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"STRING")}? id = Identifier {expr = 
ExpressionFactory.createReferenceStringExpression(id);} 
+       lit = StringLiteral {expr = 
expressionFactory.createSimpleStringExpression(lit);} 
+       | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"STRING")}? id = Identifier {expr = 
expressionFactory.createReferenceStringExpression(id);} 
        ;
 
 
 booleanExpression returns [IBooleanExpression expr = null]
        :
-       (featureExpression)=> fe = featureExpression {expr = 
ExpressionFactory.createBooleanFeatureExpression(fe);}
+       (featureExpression)=> fe = featureExpression {expr = 
expressionFactory.createBooleanFeatureExpression(fe);}
        | (e = composedBooleanExpression)=> e = composedBooleanExpression {expr 
= e;}
        |sbE =  simpleBooleanExpression {expr = sbE;}
-       //| bl = booleanListExpression LBRACK index = numberExpression RBRACK 
{expr = ExpressionFactory.createBooleanListIndexExpression(bl, index);}
+       //| bl = booleanListExpression LBRACK index = numberExpression RBRACK 
{expr = expressionFactory.createBooleanListIndexExpression(bl, index);}
        ;
 
 simpleBooleanExpression returns [IBooleanExpression expr = null]
        :
         e = literalBooleanExpression {expr = e;}
        | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), 
"BOOLEAN")}? 
-       id = Identifier {expr = 
ExpressionFactory.createReferenceBooleanExpression(id);} 
+       id = Identifier {expr = 
expressionFactory.createReferenceBooleanExpression(id);} 
        ;
 
 // not checked
@@ -2702,7 +2738,7 @@ booleanFunction returns [IBooleanExpress
 
        :
        (op = XOR LPAREN e1 = booleanExpression COMMA e2 = booleanExpression 
RPAREN)
-       {expr = ExpressionFactory.createBooleanFunction(op,e1,e2);}
+       {expr = expressionFactory.createBooleanFunction(op,e1,e2);}
        | (e = externalBooleanFunction)=> e = externalBooleanFunction {expr = 
e;}
        ;
 
@@ -2721,14 +2757,14 @@ externalBooleanFunction returns [IBoolea
 booleanCompare returns [IBooleanExpression expr = null]
        :
        (e1 = simpleBooleanExpression op = (EQUAL | NOTEQUAL) e2 = 
booleanExpression)
-       {expr = ExpressionFactory.createBooleanFunction(op,e1,e2);}
+       {expr = expressionFactory.createBooleanFunction(op,e1,e2);}
        ;
 
 
 literalBooleanExpression returns  [IBooleanExpression expr = null]
        :
-       v = TRUE {expr = ExpressionFactory.createSimpleBooleanExpression(v);} 
-       | v = FALSE {expr = ExpressionFactory.createSimpleBooleanExpression(v);}
+       v = TRUE {expr = expressionFactory.createSimpleBooleanExpression(v);} 
+       | v = FALSE {expr = expressionFactory.createSimpleBooleanExpression(v);}
        ;
 
 
@@ -2738,14 +2774,14 @@ booleanTypeExpression  returns  [IBoolea
        e1 = typeExpression
        op = (EQUAL | NOTEQUAL)
        e2 = typeExpression
-       {expr = ExpressionFactory.createBooleanTypeExpression(e1,op,e2);}
+       {expr = expressionFactory.createBooleanTypeExpression(e1,op,e2);}
        ;
 booleanStringExpression  returns  [IBooleanExpression expr = null]
        :
        e1 = stringExpression
        op = (EQUAL | NOTEQUAL)
        e2 = stringExpression
-       {expr = ExpressionFactory.createBooleanStringExpression(e1,op,e2);}
+       {expr = expressionFactory.createBooleanStringExpression(e1,op,e2);}
        ;
 
 booleanNumberExpression  returns  [IBooleanExpression expr = null]
@@ -2755,6 +2791,6 @@ booleanNumberExpression  returns  [IBool
        op = (LESS | GREATER | GREATEREQUAL | LESSEQUAL | EQUAL | 
NOTEQUAL)//{ops.add(op);} 
        e2 = numberExpression//{exprs.add(e);}
        //RPAREN
-       {expr = ExpressionFactory.createBooleanNumberExpression(e1,op,e2);}
+       {expr = expressionFactory.createBooleanNumberExpression(e1,op,e2);}
        ;
        
\ No newline at end of file

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java?rev=1784287&r1=1784286&r2=1784287&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java
 Fri Feb 24 15:45:45 2017
@@ -70,8 +70,18 @@ public class RutaScriptFactory {
 
   private UimaContext context;
 
-  public RutaScriptFactory() {
+  private ExpressionFactory expressionFactory;
+
+  private TypeUsageInformation typeUsage;
+
+  public RutaScriptFactory(ExpressionFactory expressionFactory, 
TypeUsageInformation typeUsage) {
     super();
+    this.typeUsage = typeUsage;
+    if (expressionFactory == null) {
+      this.expressionFactory = new ExpressionFactory(typeUsage);
+    } else {
+      this.expressionFactory = expressionFactory;
+    }
   }
 
   public RutaScriptBlock createScriptBlock(Token id, RutaRuleElement 
ruleElement,
@@ -109,7 +119,9 @@ public class RutaScriptFactory {
     RutaScriptBlock result = createScriptBlock(module, null, null, null, 
defaultNamespace);
     List<RuleElement> ruleElements = new ArrayList<RuleElement>();
     RuleElementIsolator container = new RuleElementIsolator();
-    MatchReference mr = ExpressionFactory.createMatchReference(new 
SimpleTypeExpression(CAS.TYPE_NAME_DOCUMENT_ANNOTATION));
+    ITypeExpression documentExpression = expressionFactory
+            .createSimpleTypeExpression(CAS.TYPE_NAME_DOCUMENT_ANNOTATION, 
null);
+    MatchReference mr = 
expressionFactory.createMatchReference(documentExpression);
     ruleElements.add(createRuleElement(mr, container, result));
     RutaRule createRule = createRule(ruleElements, result);
     container.setContainer(createRule);
@@ -119,21 +131,23 @@ public class RutaScriptFactory {
     return result;
   }
 
-  public RutaBlock createForEachBlock(Token varToken, IBooleanExpression 
direction, RutaRuleElement ruleElement, List<RutaStatement> body, RutaBlock 
parent) {
-    
-    if(varToken== null) {
-      throw new IllegalArgumentException("A FOREACH block requires that the 
annotation variable is named.");
+  public RutaBlock createForEachBlock(Token varToken, IBooleanExpression 
direction,
+          RutaRuleElement ruleElement, List<RutaStatement> body, RutaBlock 
parent) {
+
+    if (varToken == null) {
+      throw new IllegalArgumentException(
+              "A FOREACH block requires that the annotation variable is 
named.");
     }
-    
+
     String varName = varToken.getText();
     RutaRule rule = null;
-    if(ruleElement != null) {
+    if (ruleElement != null) {
       rule = createRule(ruleElement, parent);
     }
-    String namespace = parent.getNamespace()+ "." + varName;
+    String namespace = parent.getNamespace() + "." + varName;
     return new ForEachBlock(varName, direction, rule, body, parent, namespace);
   }
-  
+
   public RutaRule createRule(RuleElement element, RutaBlock parent) {
     List<RuleElement> elements = new ArrayList<RuleElement>();
     elements.add(element);
@@ -142,10 +156,10 @@ public class RutaScriptFactory {
 
   public RutaStatement createImplicitRule(List<AbstractRutaAction> actions, 
RutaBlock parent) {
     List<RuleElement> elements = new ArrayList<RuleElement>();
-    ITypeExpression documentExpression = new SimpleTypeExpression("Document");
-    MatchReference mr = 
ExpressionFactory.createMatchReference(documentExpression);
-    RutaRuleElement element = createRuleElement(mr, null, null, actions, null,
+    ITypeExpression documentExpression = 
expressionFactory.createSimpleTypeExpression("Document",
             parent);
+    MatchReference mr = 
expressionFactory.createMatchReference(documentExpression);
+    RutaRuleElement element = createRuleElement(mr, null, null, actions, null, 
parent);
     elements.add(element);
     RutaRule rule = createRule(elements, parent);
     element.setContainer(rule.getRoot());
@@ -156,16 +170,19 @@ public class RutaScriptFactory {
     return new RutaRule(elements, parent, idCounter++);
   }
 
-  public RutaRuleElement createRuleElement(MatchReference matchReference, 
RuleElementContainer container, RutaBlock parent) {
+  public RutaRuleElement createRuleElement(MatchReference matchReference,
+          RuleElementContainer container, RutaBlock parent) {
     return createRuleElement(matchReference, null, null, null, container, 
parent);
   }
-  
-  public RutaRuleElement createRuleElement(MatchReference matchReference, 
RuleElementQuantifier quantifier, List<AbstractRutaCondition> conditions,
+
+  public RutaRuleElement createRuleElement(MatchReference matchReference,
+          RuleElementQuantifier quantifier, List<AbstractRutaCondition> 
conditions,
           List<AbstractRutaAction> actions, RuleElementContainer container, 
RutaBlock parent) {
-    AnnotationTypeExpression expression = 
ExpressionFactory.createAnnotationTypeExpression(matchReference);
+    AnnotationTypeExpression expression = expressionFactory
+            .createAnnotationTypeExpression(matchReference);
     return createRuleElement(expression, quantifier, conditions, actions, 
container, parent);
   }
-  
+
   public RutaRuleElement createRuleElement(IRutaExpression expression,
           RuleElementQuantifier quantifier, List<AbstractRutaCondition> 
conditions,
           List<AbstractRutaAction> actions, RuleElementContainer container, 
RutaBlock parent) {
@@ -175,7 +192,8 @@ public class RutaScriptFactory {
     } else if (expression instanceof IStringExpression) {
       matcher = new RutaLiteralMatcher((IStringExpression) expression);
     } else {
-      throw new RuntimeException(expression.getClass().getSimpleName() + " is 
not a valid expression for a matching condition.");
+      throw new RuntimeException(expression.getClass().getSimpleName()
+              + " is not a valid expression for a matching condition.");
     }
     return new RutaRuleElement(matcher, quantifier, conditions, actions, 
container, parent);
   }
@@ -295,6 +313,4 @@ public class RutaScriptFactory {
     this.context = context;
   }
 
-  
-
 }

Added: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java?rev=1784287&view=auto
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java
 (added)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java
 Fri Feb 24 15:45:45 2017
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Container for storing information about the usage of types and annotations 
within a ruta
+ * script/module.
+ *
+ */
+public class TypeUsageInformation {
+
+  private List<String> mentionedTypes;
+
+  public TypeUsageInformation() {
+    super();
+    mentionedTypes = new ArrayList<>();
+  }
+
+  public void addMentionedType(String mention) {
+    mentionedTypes.add(mention);
+  }
+
+  public List<String> getMentionedTypes() {
+    return mentionedTypes;
+  }
+
+}

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

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java?rev=1784287&r1=1784286&r2=1784287&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java
 Fri Feb 24 15:45:45 2017
@@ -39,7 +39,9 @@ import org.apache.uima.resource.Resource
 import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.impl.ResourceManager_impl;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.ruta.RutaScriptFactory;
 import org.apache.uima.ruta.engine.RutaEngine;
+import org.apache.uima.ruta.expression.ExpressionFactory;
 import org.apache.uima.ruta.extensions.IRutaExtension;
 import org.apache.uima.ruta.extensions.RutaExternalFactory;
 import org.apache.uima.ruta.parser.RutaLexer;
@@ -128,15 +130,24 @@ public class RutaDescriptorFactory {
     RutaLexer lexer = new RutaLexer(st);
     CommonTokenStream tokens = new CommonTokenStream(lexer);
     RutaParser parser = new RutaParser(tokens);
+    
     RutaDescriptorInformation descInfo = new RutaDescriptorInformation();
+    
+    
     parser.setDescriptorInformation(descInfo);
-    // TODO no context?
-    parser.setContext(null);
+    
+    ExpressionFactory expressionFactory = new ExpressionFactory();
+    RutaScriptFactory scriptFactory = new RutaScriptFactory(expressionFactory, 
null);
+    scriptFactory.setContext(null);
+    ResourceManager rm = getResourceManager(options);
+    
+    parser.setScriptFactory(scriptFactory);
+    parser.setExpressionFactory(expressionFactory);
     parser.setExternalFactory(initializeExternalFactory(options));
-    // TODO no resource, avoid fail on missing resources while parsing
+    parser.setContext(null);
     parser.setResourcePaths(new String[0]);
-    ResourceManager rm = getResourceManager(options);
     parser.setResourceManager(rm);
+    
     String name = scriptFile.getName();
     int lastIndexOf = name.lastIndexOf(RutaEngine.SCRIPT_FILE_EXTENSION);
     if (lastIndexOf != -1) {
@@ -162,6 +173,8 @@ public class RutaDescriptorFactory {
     parser.setDescriptorInformation(descInfo);
     // TODO no context?
     parser.setContext(null);
+    parser.setScriptFactory(new RutaScriptFactory(null, null));
+    parser.setExpressionFactory(new ExpressionFactory());
     parser.setExternalFactory(initializeExternalFactory(options));
     // TODO no resource, avoid fail on missing resources while parsing
     parser.setResourcePaths(new String[0]);

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java?rev=1784287&r1=1784286&r2=1784287&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
 Fri Feb 24 15:45:45 2017
@@ -61,8 +61,11 @@ import org.apache.uima.resource.Resource
 import org.apache.uima.ruta.FilterManager;
 import org.apache.uima.ruta.RutaEnvironment;
 import org.apache.uima.ruta.RutaModule;
+import org.apache.uima.ruta.RutaScriptFactory;
 import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.TypeUsageInformation;
 import org.apache.uima.ruta.block.RutaBlock;
+import org.apache.uima.ruta.expression.ExpressionFactory;
 import org.apache.uima.ruta.extensions.IRutaExtension;
 import org.apache.uima.ruta.extensions.RutaExternalFactory;
 import org.apache.uima.ruta.parser.RutaLexer;
@@ -428,7 +431,7 @@ public class RutaEngine extends JCasAnno
 
   private RutaModule script;
 
-  private RutaExternalFactory factory;
+  private RutaExternalFactory externalFactory;
 
   private RutaVerbalizer verbalizer;
 
@@ -438,6 +441,8 @@ public class RutaEngine extends JCasAnno
 
   private List<Type> seedTypes;
 
+  private TypeUsageInformation typeUsageInformation;
+  
   private TypeSystem lastTypeSystem;
 
   private ResourceManager resourceManager = null;
@@ -455,8 +460,8 @@ public class RutaEngine extends JCasAnno
 
     this.context = aContext;
 
-    factory = new RutaExternalFactory();
-    factory.setContext(aContext);
+    externalFactory = new RutaExternalFactory();
+    externalFactory.setContext(aContext);
     verbalizer = new RutaVerbalizer();
 
     // reinitialize analysis engines if this one is configured
@@ -468,7 +473,7 @@ public class RutaEngine extends JCasAnno
     scriptRutaResourceLoader = new RutaResourceLoader(scriptPaths, 
resourceManager.getExtensionClassLoader());
     descriptorRutaResourceLoader = new RutaResourceLoader(descriptorPaths, 
resourceManager.getExtensionClassLoader());
 
-    if (!factory.isInitialized()) {
+    if (!externalFactory.isInitialized()) {
       initializeExtensionWithClassPath();
     }
     if (!reloadScript) {
@@ -630,7 +635,7 @@ public class RutaEngine extends JCasAnno
           IRutaExtension extension = (IRutaExtension) forName.newInstance();
           verbalizer.addExternalVerbalizers(extension);
           for (String name : extension.getKnownExtensions()) {
-            factory.addExtension(name, extension);
+            externalFactory.addExtension(name, extension);
           }
         }
       } catch (Exception e) {
@@ -937,6 +942,7 @@ public class RutaEngine extends JCasAnno
     } else if (Boolean.class.equals(variableType)) {
       return Boolean.parseBoolean(value);
     } else if (Type.class.equals(variableType)) {
+      // TODO
       return value;
     }  
     return null;
@@ -981,35 +987,51 @@ public class RutaEngine extends JCasAnno
     }
   }
 
-  private RutaModule loadScriptByString(String rules) throws 
RecognitionException {
+  protected RutaModule loadScriptByString(String rules) throws 
RecognitionException {
     CharStream st = new ANTLRStringStream(rules);
     RutaLexer lexer = new RutaLexer(st);
     CommonTokenStream tokens = new CommonTokenStream(lexer);
-    RutaParser parser = new RutaParser(tokens);
-    parser.setContext(context);
-    parser.setExternalFactory(factory);
-    parser.setResourcePaths(resourcePaths);
-    parser.setResourceManager(resourceManager);
+    RutaParser parser = createParser(tokens);
     RutaModule script = parser.file_input("Anonymous");
     return script;
   }
 
-  private RutaModule loadScript(Resource scriptResource, String name)
+  protected RutaModule loadScript(Resource scriptResource, String name)
           throws IOException, RecognitionException {
     InputStream scriptInputStream = scriptResource.getInputStream();
     CharStream st = new ANTLRInputStream(scriptInputStream, scriptEncoding);
     RutaLexer lexer = new RutaLexer(st);
     CommonTokenStream tokens = new CommonTokenStream(lexer);
-    RutaParser parser = new RutaParser(tokens);
-    parser.setExternalFactory(factory);
-    parser.setContext(context);
-    parser.setResourcePaths(resourcePaths);
+    RutaParser parser = createParser(tokens);
     RutaModule script = parser.file_input(name);
     return script;
   }
 
-  public RutaExternalFactory getFactory() {
-    return factory;
+  private RutaParser createParser(CommonTokenStream tokens) {
+    RutaParser parser = new RutaParser(tokens);
+    if(typeUsageInformation == null) {
+      typeUsageInformation = new TypeUsageInformation();
+    }
+    ExpressionFactory expressionFactory = new 
ExpressionFactory(typeUsageInformation);
+    RutaScriptFactory scriptFactory = new RutaScriptFactory(expressionFactory, 
typeUsageInformation);
+    scriptFactory.setContext(context);
+    
+    parser.setScriptFactory(scriptFactory);
+    parser.setExpressionFactory(expressionFactory);
+    parser.setExternalFactory(externalFactory);
+    parser.setContext(context);
+    parser.setResourcePaths(resourcePaths);
+    parser.setResourceManager(resourceManager);
+    
+    return parser;
+  }
+  
+  protected RutaExternalFactory getFactory() {
+    return externalFactory;
+  }
+  
+  protected TypeUsageInformation getTypeUsageInfomation() {
+    return typeUsageInformation;
   }
 
   @Override

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java?rev=1784287&r1=1784286&r2=1784287&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
 Fri Feb 24 15:45:45 2017
@@ -30,6 +30,7 @@ import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
 import org.apache.uima.ruta.expression.annotation.IAnnotationListExpression;
 import org.apache.uima.ruta.expression.feature.FeatureExpression;
+import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
@@ -87,32 +88,49 @@ public class AnnotationTypeExpression ex
         if (featureExpression != null) {
           Collection<? extends AnnotationFS> result = 
featureExpression.getAnnotations(annotations,
                   true, context, stream);
-          if(result.isEmpty()) {
+          if (result.isEmpty()) {
             return null;
           }
           annotations = new ArrayList<>(result);
         }
-          if (context.getDirection()) {
-            return annotations.get(annotations.size() - 1);
-          } else {
-            return annotations.get(0);
-          }
+        if (context.getDirection()) {
+          return annotations.get(annotations.size() - 1);
+        } else {
+          return annotations.get(0);
+        }
       }
     } else {
       Type type = getType(context, stream);
       if (type != null) {
-        if (getFeatureExpression() != null) {
-          List<AnnotationFS> bestGuessedAnnotationsAt = stream
-                  .getBestGuessedAnnotationsAt(context.getAnnotation(), type);
+
+        List<AnnotationFS> bestGuessedAnnotations = null;
+
+        if (featureExpression instanceof FeatureMatchExpression) {
+          // allow more matches for feature matches
+          bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, 
context);
+        } else if(featureExpression != null) {
+          bestGuessedAnnotations = 
stream.getBestGuessedAnnotationsAt(context.getAnnotation(),
+                  type);
+        } else {
+          bestGuessedAnnotations = 
stream.getBestGuessedAnnotationsAt(context.getAnnotation(),
+                  type);
+          if (bestGuessedAnnotations.isEmpty()) {
+            bestGuessedAnnotations = new ArrayList<>(1);
+            
bestGuessedAnnotations.add(stream.getSingleAnnotationByTypeInContext(type, 
context));
+          }
+        }
+
+        if (featureExpression != null) {
           Collection<AnnotationFS> annotations = new ArrayList<>();
-          annotations.addAll(bestGuessedAnnotationsAt);
-          Collection<? extends AnnotationFS> featureAnnotations = 
getFeatureExpression()
-                  .getAnnotations(annotations, false, context, stream);
+          annotations.addAll(bestGuessedAnnotations);
+          Collection<? extends AnnotationFS> featureAnnotations = 
featureExpression
+                  .getAnnotations(annotations, true, context, stream);
           if (featureAnnotations != null && !featureAnnotations.isEmpty()) {
             return featureAnnotations.iterator().next();
           }
-        } else {
-          return stream.getSingleAnnotationByTypeInContext(type, context);
+        }
+        if (bestGuessedAnnotations != null && 
!bestGuessedAnnotations.isEmpty()) {
+          return bestGuessedAnnotations.get(0);
         }
       }
     }
@@ -180,17 +198,35 @@ public class AnnotationTypeExpression ex
         return result;
       }
     } else {
-
       Type type = getType(context, stream);
       if (type != null) {
-        if (getFeatureExpression() != null) {
-          List<AnnotationFS> bestGuessedAnnotationsAt = stream
-                  .getBestGuessedAnnotationsAt(context.getAnnotation(), type);
-          Collection<? extends AnnotationFS> featureAnnotations = 
getFeatureExpression()
-                  .getAnnotations(bestGuessedAnnotationsAt, false, context, 
stream);
-          return new ArrayList<>(featureAnnotations);
+
+        List<AnnotationFS> bestGuessedAnnotations = null;
+
+        if (featureExpression instanceof FeatureMatchExpression) {
+          // allow more matches for feature matches
+          bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, 
context);
+        } else if(featureExpression != null) {
+          bestGuessedAnnotations = 
stream.getBestGuessedAnnotationsAt(context.getAnnotation(),
+                  type);
+          if (bestGuessedAnnotations.isEmpty()) {
+            bestGuessedAnnotations =stream.getAnnotationsByTypeInContext(type, 
context);
+          }
         } else {
-          return stream.getAnnotationsByTypeInContext(type, context);
+            bestGuessedAnnotations =stream.getAnnotationsByTypeInContext(type, 
context);
+        }
+
+        if (featureExpression != null) {
+          Collection<AnnotationFS> annotations = new ArrayList<>();
+          annotations.addAll(bestGuessedAnnotations);
+          Collection<? extends AnnotationFS> featureAnnotations = 
featureExpression
+                  .getAnnotations(annotations, true, context, stream);
+          if (featureAnnotations != null && !featureAnnotations.isEmpty()) {
+            return new ArrayList<>(featureAnnotations);
+          }
+        }
+        if (bestGuessedAnnotations != null && 
!bestGuessedAnnotations.isEmpty()) {
+          return bestGuessedAnnotations;
         }
       }
     }

Added: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java?rev=1784287&view=auto
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java
 (added)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java
 Fri Feb 24 15:45:45 2017
@@ -0,0 +1,79 @@
+/*
+ * 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 static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.condition.AbstractRutaCondition;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationListExpression;
+import org.apache.uima.ruta.expression.feature.FeatureExpression;
+import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
+import org.apache.uima.ruta.rule.EvaluatedCondition;
+import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+public class ConditionedAnnotationTypeExpression extends 
AnnotationTypeExpression {
+
+  private AbstractRutaCondition condition;
+
+  public ConditionedAnnotationTypeExpression(MatchReference reference,
+          AbstractRutaCondition condition) {
+    super(reference);
+    this.condition = condition;
+  }
+
+  @Override
+  public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
+   List<AnnotationFS> annotationList = getAnnotationList(context, stream);
+   if(!annotationList.isEmpty()) {
+     return annotationList.get(0);
+   }
+   return null;
+  }
+
+  @Override
+  public List<AnnotationFS> getAnnotationList(MatchContext context, RutaStream 
stream) {
+    List<AnnotationFS> annotationList = super.getAnnotationList(context, 
stream);
+    List<AnnotationFS> result = new ArrayList<>();
+    for (AnnotationFS annotation : annotationList) {
+      if(evalulate(context, stream, annotation)) {
+        result.add(annotation);
+      }
+    }
+    return result;
+  }
+
+  private boolean evalulate(MatchContext context, RutaStream stream, 
AnnotationFS annotation) {
+    MatchContext localContext = new MatchContext(annotation, 
context.getElement(), context.getRuleMatch(), context.getDirection());
+    EvaluatedCondition eval = condition.eval(localContext, stream, 
InferenceCrowd.emptyCrowd);
+    return eval.isValue();
+  }
+  
+}

Propchange: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.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=1784287&r1=1784286&r2=1784287&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
 Fri Feb 24 15:45:45 2017
@@ -24,7 +24,11 @@ import java.util.List;
 
 import org.antlr.runtime.Token;
 import org.apache.uima.cas.CAS;
+import org.apache.uima.ruta.TypeUsageInformation;
 import org.apache.uima.ruta.block.RutaBlock;
+import org.apache.uima.ruta.condition.AbstractRutaCondition;
+import org.apache.uima.ruta.condition.AndCondition;
+import org.apache.uima.ruta.condition.ConditionFactory;
 import 
org.apache.uima.ruta.expression.annotation.AbstractAnnotationListExpression;
 import org.apache.uima.ruta.expression.annotation.AnnotationAddressExpression;
 import org.apache.uima.ruta.expression.annotation.AnnotationFeatureExpression;
@@ -94,10 +98,18 @@ import org.apache.uima.ruta.expression.t
 
 public class ExpressionFactory {
 
-  private ExpressionFactory() {
+  private TypeUsageInformation typeUsage;
+
+  public ExpressionFactory() {
+    this(null);
+  }
+
+  public ExpressionFactory(TypeUsageInformation typeUsage) {
+    super();
+    this.typeUsage = typeUsage;
   }
 
-  public static INumberExpression createIntegerExpression(Token number, Token 
minus) {
+  public INumberExpression createIntegerExpression(Token number, Token minus) {
     Integer valueOf = Integer.valueOf(number.getText());
     SimpleNumberExpression simpleNumberExpression = new 
SimpleNumberExpression(valueOf);
     if (minus != null) {
@@ -107,7 +119,7 @@ public class ExpressionFactory {
     }
   }
 
-  public static INumberExpression createDoubleExpression(Token number, Token 
minus) {
+  public INumberExpression createDoubleExpression(Token number, Token minus) {
     Double valueOf = Double.valueOf(number.getText());
     SimpleNumberExpression simpleNumberExpression = new 
SimpleNumberExpression(valueOf);
     if (minus != null) {
@@ -117,7 +129,7 @@ public class ExpressionFactory {
     }
   }
 
-  public static INumberExpression createReferenceNumberExpression(Token var, 
Token minus) {
+  public INumberExpression createReferenceNumberExpression(Token var, Token 
minus) {
     NumberVariableExpression simpleNumberExpression = new 
NumberVariableExpression(var.getText());
     if (minus != null) {
       return new NegativeNumberExpression(simpleNumberExpression);
@@ -126,8 +138,8 @@ public class ExpressionFactory {
     }
   }
 
-  public static INumberExpression createComposedNumberExpression(
-          List<INumberExpression> expressions, List<Token> opTokens) {
+  public INumberExpression 
createComposedNumberExpression(List<INumberExpression> expressions,
+          List<Token> opTokens) {
     List<String> ops = new ArrayList<String>();
     for (Token token : opTokens) {
       ops.add(token.getText());
@@ -135,7 +147,7 @@ public class ExpressionFactory {
     return new ComposedNumberExpression(expressions, ops);
   }
 
-  public static INumberExpression 
createComposedNumberExpression(INumberExpression expression,
+  public INumberExpression createComposedNumberExpression(INumberExpression 
expression,
           Token opToken) {
     List<String> ops = new ArrayList<String>();
     List<INumberExpression> exprList = new ArrayList<INumberExpression>();
@@ -144,7 +156,7 @@ public class ExpressionFactory {
     return new ComposedNumberExpression(exprList, ops);
   }
 
-  public static INumberExpression 
createComposedNumberExpression(INumberExpression expression1,
+  public INumberExpression createComposedNumberExpression(INumberExpression 
expression1,
           Token opToken, INumberExpression expression2) {
     List<String> ops = new ArrayList<String>();
     List<INumberExpression> exprList = new ArrayList<INumberExpression>();
@@ -154,270 +166,274 @@ public class ExpressionFactory {
     return new ComposedNumberExpression(exprList, ops);
   }
 
-  public static AbstractStringExpression createSimpleStringExpression(Token 
token) {
+  public AbstractStringExpression createSimpleStringExpression(Token token) {
     String text = token.getText();
     String substring = text.substring(1, text.length() - 1);
     return new SimpleStringExpression(substring);
   }
 
-  public static IStringExpression 
createComposedStringExpression(List<IStringExpression> expressions) {
+  public IStringExpression 
createComposedStringExpression(List<IStringExpression> expressions) {
     return new ComposedStringExpression(expressions);
   }
 
-  public static AbstractStringExpression createReferenceStringExpression(Token 
var) {
+  public AbstractStringExpression createReferenceStringExpression(Token var) {
     return new StringVariableExpression(var.getText());
   }
 
-  public static IBooleanExpression 
createBooleanNumberExpression(INumberExpression e1, Token op,
+  public IBooleanExpression createBooleanNumberExpression(INumberExpression 
e1, Token op,
           INumberExpression e2) {
     return new BooleanNumberExpression(e1, op.getText(), e2);
   }
-  
-  public static IBooleanExpression 
createBooleanStringExpression(IStringExpression e1, Token op,
+
+  public IBooleanExpression createBooleanStringExpression(IStringExpression 
e1, Token op,
           IStringExpression e2) {
     return new BooleanStringExpression(e1, op.getText(), e2);
   }
 
-  public static IBooleanExpression createSimpleBooleanExpression(Token v) {
+  public IBooleanExpression createSimpleBooleanExpression(Token v) {
     return new SimpleBooleanExpression(Boolean.valueOf(v.getText()));
   }
 
-  public static IBooleanExpression createReferenceBooleanExpression(Token id) {
+  public IBooleanExpression createReferenceBooleanExpression(Token id) {
     return new BooleanVariableExpression(id.getText());
   }
 
-  public static ITypeExpression createSimpleTypeExpression(Token typeToken, 
RutaBlock parent) {
+  public ITypeExpression createSimpleTypeExpression(Token typeToken, RutaBlock 
parent) {
     String typeString = typeToken == null ? CAS.TYPE_NAME_DOCUMENT_ANNOTATION 
: typeToken.getText();
     return new SimpleTypeExpression(typeString);
   }
 
-  public static ITypeExpression createReferenceTypeExpression(Token varToken) {
+  public ITypeExpression createReferenceTypeExpression(Token varToken) {
     String varString = varToken == null ? "" : varToken.getText();
     return new TypeVariableExpression(varString);
   }
 
-  public static ITypeExpression createSimpleTypeExpression(String typeString, 
RutaBlock parent) {
+  public ITypeExpression createSimpleTypeExpression(String typeString, 
RutaBlock parent) {
     return new SimpleTypeExpression(typeString);
   }
 
-  public static IBooleanExpression createBooleanFunction(Token op, 
IBooleanExpression e1,
+  public IBooleanExpression createBooleanFunction(Token op, IBooleanExpression 
e1,
           IBooleanExpression e2) {
     return new SimpleBooleanFunction(op.getText(), e1, e2);
   }
 
-  public static WordTableExpression createReferenceWordTableExpression(Token 
id) {
+  public WordTableExpression createReferenceWordTableExpression(Token id) {
     return new ReferenceWordTableExpression(id.getText());
   }
 
-  public static WordListExpression createReferenceWordListExpression(Token id) 
{
+  public WordListExpression createReferenceWordListExpression(Token id) {
     return new ReferenceWordListExpression(id.getText());
   }
 
-  public static WordListExpression createLiteralWordListExpression(Token path) 
{
+  public WordListExpression createLiteralWordListExpression(Token path) {
     return new LiteralWordListExpression(path.getText());
   }
 
-  public static WordTableExpression createLiteralWordTableExpression(Token 
path) {
+  public WordTableExpression createLiteralWordTableExpression(Token path) {
     return new LiteralWordTableExpression(path.getText());
   }
-  
-  public static WordListExpression 
createStringWordListExpression(IStringExpression expr) {
+
+  public WordListExpression createStringWordListExpression(IStringExpression 
expr) {
     return new StringWordListExpression(expr);
   }
 
-  public static WordTableExpression 
createStringWordTableExpression(IStringExpression expr) {
+  public WordTableExpression createStringWordTableExpression(IStringExpression 
expr) {
     return new StringWordTableExpression(expr);
   }
 
-  public static IBooleanExpression createBooleanTypeExpression(ITypeExpression 
e1, Token op,
+  public IBooleanExpression createBooleanTypeExpression(ITypeExpression e1, 
Token op,
           ITypeExpression e2) {
     return new BooleanTypeExpression(e1, op.getText(), e2);
   }
 
-  public static AbstractBooleanListExpression 
createReferenceBooleanListExpression(Token var) {
+  public AbstractBooleanListExpression 
createReferenceBooleanListExpression(Token var) {
     return new BooleanListVariableExpression(var.getText());
   }
 
-  public static AbstractStringListExpression 
createReferenceStringListExpression(Token var) {
+  public AbstractStringListExpression 
createReferenceStringListExpression(Token var) {
     return new StringListVariableExpression(var.getText());
   }
 
-  public static AbstractTypeListExpression 
createReferenceTypeListExpression(Token var) {
+  public AbstractTypeListExpression createReferenceTypeListExpression(Token 
var) {
     return new TypeListVariableExpression(var.getText());
   }
 
-  public static AbstractNumberListExpression 
createReferenceDoubleListExpression(Token var) {
+  public AbstractNumberListExpression 
createReferenceDoubleListExpression(Token var) {
     return new NumberListVariableExpression(var.getText());
   }
 
-  public static AbstractNumberListExpression 
createReferenceIntListExpression(Token var) {
+  public AbstractNumberListExpression createReferenceIntListExpression(Token 
var) {
     return new NumberListVariableExpression(var.getText());
   }
 
-  public static AbstractNumberListExpression 
createReferenceFloatListExpression(Token var) {
+  public AbstractNumberListExpression createReferenceFloatListExpression(Token 
var) {
     return new NumberListVariableExpression(var.getText());
   }
 
-  public static AbstractBooleanListExpression 
createBooleanListExpression(List<IBooleanExpression> list) {
+  public AbstractBooleanListExpression 
createBooleanListExpression(List<IBooleanExpression> list) {
     return new SimpleBooleanListExpression(list);
   }
 
-  public static AbstractNumberListExpression 
createNumberListExpression(List<INumberExpression> list) {
+  public AbstractNumberListExpression 
createNumberListExpression(List<INumberExpression> list) {
     return new SimpleNumberListExpression(list);
   }
 
-  public static AbstractTypeListExpression 
createTypeListExpression(List<ITypeExpression> list) {
+  public AbstractTypeListExpression 
createTypeListExpression(List<ITypeExpression> list) {
     return new SimpleTypeListExpression(list);
   }
 
-  public static AbstractStringListExpression 
createStringListExpression(List<IStringExpression> list) {
+  public AbstractStringListExpression 
createStringListExpression(List<IStringExpression> list) {
     return new SimpleStringListExpression(list);
   }
 
-  public static FeatureExpression createFeatureExpression(MatchReference mr, 
RutaBlock env) {
+  public FeatureExpression createFeatureExpression(MatchReference mr, 
RutaBlock env) {
     return new SimpleFeatureExpression(mr);
   }
 
-  public static FeatureMatchExpression 
createFeatureMatchExpression(MatchReference mr, Token opToken,
+  public FeatureMatchExpression createFeatureMatchExpression(MatchReference 
mr, Token opToken,
           IRutaExpression arg, RutaBlock env) {
     String op = "";
-    if(opToken != null) {
+    if (opToken != null) {
       op = opToken.getText();
     }
     return new FeatureMatchExpression(mr, op, arg);
   }
 
-  public static MatchReference createMatchReference(Token refToken) {
+  public MatchReference createMatchReference(Token refToken) {
     return createMatchReference(refToken, null, null);
   }
-  
-  public static MatchReference createMatchReference(Token matchToken, Token 
comparatorToken, IRutaExpression argument) {
+
+  public MatchReference createMatchReference(Token matchToken, Token 
comparatorToken,
+          IRutaExpression argument) {
     String match = matchToken.getText();
     String comparator = null;
-    if(comparatorToken != null) {
+    if (comparatorToken != null) {
       comparator = comparatorToken.getText();
     }
+    // TODO , mentions in token?
     return new MatchReference(match, comparator, argument);
   }
-  
-  public static MatchReference createMatchReference(ITypeExpression 
expression) {
+
+  public MatchReference createMatchReference(ITypeExpression expression) {
     return new MatchReference(expression);
   }
 
-  public static MatchReference createMatchReference(IAnnotationExpression 
expression) {
+  public MatchReference createMatchReference(IAnnotationExpression expression) 
{
     return new MatchReference(expression);
   }
 
-  public static INumberExpression 
createNumberFeatureExpression(FeatureExpression fe) {
+  public INumberExpression createNumberFeatureExpression(FeatureExpression fe) 
{
     return new NumberFeatureExpression(fe);
   }
 
-  public static AbstractStringExpression 
createStringFeatureExpression(FeatureExpression fe) {
+  public AbstractStringExpression 
createStringFeatureExpression(FeatureExpression fe) {
     return new StringFeatureExpression(fe);
   }
 
-  public static IBooleanExpression 
createBooleanFeatureExpression(FeatureExpression fe) {
+  public IBooleanExpression createBooleanFeatureExpression(FeatureExpression 
fe) {
     return new BooleanFeatureExpression(fe);
   }
 
-  public static GenericFeatureExpression 
createGenericFeatureExpression(FeatureExpression fe) {
+  public GenericFeatureExpression 
createGenericFeatureExpression(FeatureExpression fe) {
     return new GenericFeatureExpression(fe);
   }
 
-  public static ListExpression<Object> 
createUntypedListExpression(List<IRutaExpression> list) {
+  public ListExpression<Object> 
createUntypedListExpression(List<IRutaExpression> list) {
     return new UntypedListExpression(list);
   }
 
-  public static WordListExpression createExternalWordListExpression(Token name,
+  public WordListExpression createExternalWordListExpression(Token name,
           List<IStringExpression> args) {
     return new ExternalWordListExpression(name.getText(), args);
   }
 
-  public static WordTableExpression createExternalWordTableExpression(Token 
name,
+  public WordTableExpression createExternalWordTableExpression(Token name,
           List<IStringExpression> args) {
     return new ExternalWordTableExpression(name.getText(), args);
   }
 
-  public static IRutaExpression createNullExpression() {
+  public IRutaExpression createNullExpression() {
     return new NullExpression();
   }
 
-  public static IAnnotationExpression createAnnotationAddressExpression(Token 
address) {
+  public IAnnotationExpression createAnnotationAddressExpression(Token 
address) {
     return new AnnotationAddressExpression(address.getText());
   }
 
-  public static IRutaExpression createAnnotationLabelExpression(Token label) {
+  public IRutaExpression createAnnotationLabelExpression(Token label) {
     return new AnnotationLabelExpression(label.getText());
   }
 
-  public static IRutaExpression createAnnotationVariableExpression(Token var) {
+  public IRutaExpression createAnnotationVariableExpression(Token var) {
     return new AnnotationVariableExpression(var.getText());
   }
 
-  public static AbstractAnnotationListExpression 
createAnnotationListVariableExpression(Token var) {
+  public AbstractAnnotationListExpression 
createAnnotationListVariableExpression(Token var) {
     return new AnnotationListVariableExpression(var.getText());
   }
 
-  public static IAnnotationExpression createAnnotationFeatureExpression(
+  public IAnnotationExpression createAnnotationFeatureExpression(
           FeatureExpression featureExpression) {
     return new AnnotationFeatureExpression(featureExpression);
   }
-  
-  public static IAnnotationListExpression 
createAnnotationListFeatureExpression(
+
+  public IAnnotationListExpression createAnnotationListFeatureExpression(
           FeatureExpression featureExpression) {
     return new AnnotationListFeatureExpression(featureExpression);
   }
-  
-  public static IBooleanListExpression createBooleanListFeatureExpression(
+
+  public IBooleanListExpression createBooleanListFeatureExpression(
           FeatureExpression featureExpression) {
     return new BooleanListFeatureExpression(featureExpression);
   }
-  
-  public static INumberListExpression createNumberListFeatureExpression(
+
+  public INumberListExpression createNumberListFeatureExpression(
           FeatureExpression featureExpression) {
     return new NumberListFeatureExpression(featureExpression);
   }
-  
-  public static IStringListExpression createStringListFeatureExpression(
+
+  public IStringListExpression createStringListFeatureExpression(
           FeatureExpression featureExpression) {
     return new StringListFeatureExpression(featureExpression);
   }
 
-  public static IRutaExpression createGenericExpression(Token ref) {
+  public IRutaExpression createGenericExpression(Token ref) {
     MatchReference match = new MatchReference(ref.getText());
     return new AnnotationTypeExpression(match);
   }
-  
-  
-  public static AnnotationTypeExpression 
createAnnotationTypeExpression(MatchReference mr) {
+
+  public AnnotationTypeExpression 
createAnnotationTypeExpression(MatchReference mr) {
     return new AnnotationTypeExpression(mr);
   }
+  
+  public AnnotationTypeExpression 
createConditionedAnnotationTypeExpression(MatchReference mr, 
List<AbstractRutaCondition> conditions) {
+    AbstractRutaCondition condition = 
ConditionFactory.createConditionAnd(conditions, null);
+    return new ConditionedAnnotationTypeExpression(mr, condition);
+  }
 
-  public static IStringExpression 
createStringListIndexExpression(AbstractStringListExpression sl,
+  public IStringExpression 
createStringListIndexExpression(AbstractStringListExpression sl,
           INumberExpression index) {
     return null;
   }
-  
-  public static IBooleanExpression 
createBooleanListIndexExpression(IBooleanListExpression bl,
+
+  public IBooleanExpression 
createBooleanListIndexExpression(IBooleanListExpression bl,
           INumberExpression index) {
     return null;
   }
-  
-  public static INumberExpression 
createNumberListIndexExpression(AbstractNumberListExpression nl,
+
+  public INumberExpression 
createNumberListIndexExpression(AbstractNumberListExpression nl,
           INumberExpression index) {
     return null;
   }
-  
-  public static ITypeExpression 
createTypeListIndexExpression(AbstractTypeListExpression tl,
+
+  public ITypeExpression 
createTypeListIndexExpression(AbstractTypeListExpression tl,
           INumberExpression index) {
     return null;
   }
-  
-  public static IAnnotationExpression 
createAnnotationListIndexExpression(AbstractAnnotationListExpression al,
-          INumberExpression index) {
+
+  public IAnnotationExpression createAnnotationListIndexExpression(
+          AbstractAnnotationListExpression al, INumberExpression index) {
     return null;
   }
 
- 
-
 }

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java?rev=1784287&r1=1784286&r2=1784287&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java
 Fri Feb 24 15:45:45 2017
@@ -65,15 +65,18 @@ public class GenericFeatureExpression ex
 
   private IAnnotationListExpression annotationListExpression;
 
+  private ExpressionFactory expressionFactory;
+  
   public GenericFeatureExpression(FeatureExpression fe) {
     super();
     this.featureExpression = fe;
+    this.expressionFactory = new ExpressionFactory();
   }
 
   @Override
   public String getStringValue(MatchContext context, RutaStream stream) {
     if (stringExpression == null) {
-      stringExpression = 
ExpressionFactory.createStringFeatureExpression(featureExpression);
+      stringExpression = 
expressionFactory.createStringFeatureExpression(featureExpression);
     }
     return stringExpression.getStringValue(context, stream);
   }
@@ -81,7 +84,7 @@ public class GenericFeatureExpression ex
   @Override
   public boolean getBooleanValue(MatchContext context, RutaStream stream) {
     if (booleanExpression == null) {
-      booleanExpression = 
ExpressionFactory.createBooleanFeatureExpression(featureExpression);
+      booleanExpression = 
expressionFactory.createBooleanFeatureExpression(featureExpression);
     }
     return booleanExpression.getBooleanValue(context, stream);
   }
@@ -89,7 +92,7 @@ public class GenericFeatureExpression ex
   @Override
   public int getIntegerValue(MatchContext context, RutaStream stream) {
     if (numberExpression == null) {
-      numberExpression = 
ExpressionFactory.createNumberFeatureExpression(featureExpression);
+      numberExpression = 
expressionFactory.createNumberFeatureExpression(featureExpression);
     }
     return numberExpression.getIntegerValue(context, stream);
   }
@@ -97,7 +100,7 @@ public class GenericFeatureExpression ex
   @Override
   public double getDoubleValue(MatchContext context, RutaStream stream) {
     if (numberExpression == null) {
-      numberExpression = 
ExpressionFactory.createNumberFeatureExpression(featureExpression);
+      numberExpression = 
expressionFactory.createNumberFeatureExpression(featureExpression);
     }
     return numberExpression.getDoubleValue(context, stream);
   }
@@ -105,7 +108,7 @@ public class GenericFeatureExpression ex
   @Override
   public float getFloatValue(MatchContext context, RutaStream stream) {
     if (numberExpression == null) {
-      numberExpression = 
ExpressionFactory.createNumberFeatureExpression(featureExpression);
+      numberExpression = 
expressionFactory.createNumberFeatureExpression(featureExpression);
     }
     return numberExpression.getFloatValue(context, stream);
   }
@@ -113,7 +116,7 @@ public class GenericFeatureExpression ex
   @Override
   public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
     if (annotationExpression == null) {
-      annotationExpression = 
ExpressionFactory.createAnnotationFeatureExpression(featureExpression);
+      annotationExpression = 
expressionFactory.createAnnotationFeatureExpression(featureExpression);
     }
     return annotationExpression.getAnnotation(context, stream);
   }
@@ -121,7 +124,7 @@ public class GenericFeatureExpression ex
   @Override
   public FeatureStructure getFeatureStructure(MatchContext context, RutaStream 
stream) {
     if (annotationExpression == null) {
-      annotationExpression = 
ExpressionFactory.createAnnotationFeatureExpression(featureExpression);
+      annotationExpression = 
expressionFactory.createAnnotationFeatureExpression(featureExpression);
     }
     return annotationExpression.getFeatureStructure(context, stream);
   }
@@ -144,7 +147,7 @@ public class GenericFeatureExpression ex
   @Override
   public List<String> getStringList(MatchContext context, RutaStream stream) {
     if (stringListExpression == null) {
-      stringListExpression = 
ExpressionFactory.createStringListFeatureExpression(featureExpression);
+      stringListExpression = 
expressionFactory.createStringListFeatureExpression(featureExpression);
     }
     return stringListExpression.getStringList(context, stream);
   }
@@ -152,7 +155,7 @@ public class GenericFeatureExpression ex
   @Override
   public List<Number> getNumberList(MatchContext context, RutaStream stream) {
     if (numberListExpression == null) {
-      numberListExpression = 
ExpressionFactory.createNumberListFeatureExpression(featureExpression);
+      numberListExpression = 
expressionFactory.createNumberListFeatureExpression(featureExpression);
     }
     return numberListExpression.getNumberList(context, stream);
   }
@@ -160,7 +163,7 @@ public class GenericFeatureExpression ex
   @Override
   public List<Boolean> getBooleanList(MatchContext context, RutaStream stream) 
{
     if (booleanListExpression == null) {
-      booleanListExpression = ExpressionFactory
+      booleanListExpression = expressionFactory
               .createBooleanListFeatureExpression(featureExpression);
     }
     return booleanListExpression.getBooleanList(context, stream);
@@ -169,7 +172,7 @@ public class GenericFeatureExpression ex
   @Override
   public List<AnnotationFS> getAnnotationList(MatchContext context, RutaStream 
stream) {
     if (annotationListExpression == null) {
-      annotationListExpression = ExpressionFactory
+      annotationListExpression = expressionFactory
               .createAnnotationListFeatureExpression(featureExpression);
     }
     return annotationListExpression.getAnnotationList(context, stream);

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java?rev=1784287&r1=1784286&r2=1784287&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java
 Fri Feb 24 15:45:45 2017
@@ -19,6 +19,7 @@
 
 package org.apache.uima.ruta.visitor;
 
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.uima.cas.text.AnnotationFS;
@@ -30,6 +31,8 @@ import org.apache.uima.ruta.rule.Abstrac
 
 public class InferenceCrowd implements RutaInferenceVisitor {
 
+  public static InferenceCrowd emptyCrowd = new 
InferenceCrowd(Collections.<RutaInferenceVisitor>emptyList());
+  
   private final List<RutaInferenceVisitor> visitors;
 
   public InferenceCrowd(List<RutaInferenceVisitor> visitors) {

Added: 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java?rev=1784287&view=auto
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
 (added)
+++ 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
 Fri Feb 24 15:45:45 2017
@@ -0,0 +1,34 @@
+/*
+ * 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.engine;
+
+import org.antlr.runtime.RecognitionException;
+import org.junit.Test;
+
+public class RutaEngineTest {
+
+  @Test
+  public void testTypeUsageInformation() throws Exception {
+    RutaEngine engine = new RutaEngine();
+    String script = "";
+
+    engine.loadScriptByString(script);
+  }
+  
+}

Propchange: 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java?rev=1784287&view=auto
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java
 (added)
+++ 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java
 Fri Feb 24 15:45:45 2017
@@ -0,0 +1,61 @@
+/*
+ * 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 java.util.ArrayList;
+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 ConditionedAnnotationTypeExpressionTest {
+
+  @Test
+  public void test() throws Exception {
+    String document = "This is a test.";
+    String script = "";
+    script += "Document{-> CREATE(Struct1, \"a\" = SW{SW.begin==8})};\n";
+    script += "Document{-> CREATE(Struct2, \"a\" = 
SW.begin==8{REGEXP(\"a\")})};\n";
+    script += "Struct1.a{-> T1};\n";
+    script += "Struct2.a{-> T2};\n";
+    
+    Map<String, String> complexTypes = new TreeMap<String, String>();
+    complexTypes.put("Struct1", "uima.tcas.Annotation");
+    complexTypes.put("Struct2", "uima.tcas.Annotation");
+    Map<String, List<TestFeature>> features = new TreeMap<String, 
List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    features.put("Struct1", list);
+    features.put("Struct2", list);
+    list.add(new TestFeature("a", "", "uima.tcas.Annotation"));
+    list.add(new TestFeature("as", "", "uima.cas.FSArray"));
+    
+    CAS cas = RutaTestUtils.getCAS(document, complexTypes, features);
+    Ruta.apply(cas, script);    
+    
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "a");
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "a");
+  }
+
+}

Propchange: 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to