Author: pkluegl
Date: Tue Aug  4 11:47:41 2015
New Revision: 1694033

URL: http://svn.apache.org/r1694033
Log:
UIMA-4547
- PARSE with optional locale
- introduced POW function

Modified:
    
uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g
    
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/condition/ConditionFactory.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.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/RutaExpression.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java
    
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java
    
uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta
    uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml
    
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g
    
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/core/RutaKeywords.java
    
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/RutaLexer.g
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g
 Tue Aug  4 11:47:41 2015
@@ -367,6 +367,7 @@ LOGN        :       'LOGN';
 SIN    :       'SIN';
 COS    :       'COS';
 TAN    :       'TAN';
+POW : 'POW';
 XOR    :       'XOR';
 TRUE   :       'true';
 FALSE  :       'false';

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=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
 Tue Aug  4 11:47:41 2015
@@ -1434,8 +1434,10 @@ conditionFeature returns [AbstractRutaCo
 
 conditionParse returns [AbstractRutaCondition cond = null]
     :
-    PARSE LPAREN {isVariable($blockDeclaration::env,input.LT(1).getText())}? 
id = Identifier RPAREN
-    {cond = ConditionFactory.createConditionParse(id, $blockDeclaration::env);}
+    PARSE LPAREN {isVariable($blockDeclaration::env,input.LT(1).getText())}? 
id = Identifier 
+    (COMMA locale = stringExpression)?
+    RPAREN
+    {cond = ConditionFactory.createConditionParse(id, locale, 
$blockDeclaration::env);}
     ;
 
 conditionIs returns [AbstractRutaCondition cond = null]
@@ -2215,8 +2217,10 @@ List<IStringExpression> args = new Array
 // not checked
 numberFunction returns [INumberExpression expr = null]
        :
-       (op=(EXP | LOGN | SIN | COS | TAN) numExprP=numberExpressionInPar)
+       (op=(EXP | LOGN | SIN | COS | TAN ) numExprP=numberExpressionInPar)
        {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)}
        | (e = externalNumberFunction)=> e = externalNumberFunction {expr = e;}
        ;

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java
 Tue Aug  4 11:47:41 2015
@@ -168,9 +168,9 @@ public class ConditionFactory {
     return null;
   }
 
-  public static AbstractRutaCondition createConditionParse(Token id, RutaBlock 
env) {
+  public static AbstractRutaCondition createConditionParse(Token id, 
IStringExpression localeExpr, RutaBlock env) {
     String var = id == null ? "" : id.getText();
-    return new ParseCondition(var);
+    return new ParseCondition(var, localeExpr);
   }
 
   public static AbstractRutaCondition createConditionVariable(Token id) {

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java
 Tue Aug  4 11:47:41 2015
@@ -19,10 +19,14 @@
 
 package org.apache.uima.ruta.condition;
 
+import java.text.NumberFormat;
+import java.util.Locale;
+
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.ruta.RutaEnvironment;
 import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.rule.EvaluatedCondition;
 import org.apache.uima.ruta.rule.RuleElement;
 import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -31,10 +35,18 @@ public class ParseCondition extends Abst
 
   private final String var;
 
+  private IStringExpression localeExpr;
+  
   public ParseCondition(String var) {
     super();
     this.var = var;
   }
+  
+  public ParseCondition(String var, IStringExpression localeExpr) {
+    super();
+    this.var = var;
+    this.localeExpr = localeExpr;
+  }
 
   @Override
   public EvaluatedCondition eval(AnnotationFS annotation, RuleElement element, 
RutaStream stream,
@@ -42,16 +54,27 @@ public class ParseCondition extends Abst
     String text = annotation.getCoveredText();
     RutaEnvironment env = element.getParent().getEnvironment();
     Class<?> type = env.getVariableType(var);
+    NumberFormat nf = null;
+    String locale = annotation.getCAS().getDocumentLanguage();
+    if(localeExpr != null) {
+      locale = localeExpr.getStringValue(element.getParent(), annotation, 
stream);
+    }
+    if(locale == null) {
+      locale = "x-unspecified";
+    }
+    nf = NumberFormat.getInstance(Locale.forLanguageTag(locale));     
     try {
       if (Integer.class.equals(type)) {
-        text = normalizeNumber(text);
-        int value = Integer.valueOf(text);
-        env.setVariableValue(var, value);
+        Number parse = nf.parse(text);
+        env.setVariableValue(var, parse.intValue());
         return new EvaluatedCondition(this, true);
       } else if (Double.class.equals(type)) {
-        text = normalizeNumber(text);
-        double value = Double.valueOf(text);
-        env.setVariableValue(var, value);
+        Number parse = nf.parse(text);
+        env.setVariableValue(var, parse.doubleValue());
+        return new EvaluatedCondition(this, true);
+      } else if (Float.class.equals(type)) {
+        Number parse = nf.parse(text);
+        env.setVariableValue(var, parse.floatValue());
         return new EvaluatedCondition(this, true);
       } else if (String.class.equals(type)) {
         env.setVariableValue(var, text);
@@ -71,16 +94,16 @@ public class ParseCondition extends Abst
     }
   }
 
-  private String normalizeNumber(String text) {
-    String[] split = text.split("[,]");
-    if (split.length == 2) {
-      return text.replaceAll(",", ".");
-    }
-    return text;
-  }
-
   public String getVar() {
     return var;
   }
 
+  public IStringExpression getLocaleExpr() {
+    return localeExpr;
+  }
+
+  public void setLocaleExpr(IStringExpression localeExpr) {
+    this.localeExpr = localeExpr;
+  }
+
 }

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=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
 Tue Aug  4 11:47:41 2015
@@ -124,6 +124,16 @@ public class ExpressionFactory {
     exprList.add(expression);
     return new ComposedNumberExpression(exprList, ops);
   }
+  
+  public static INumberExpression 
createComposedNumberExpression(INumberExpression expression1,
+          Token opToken, INumberExpression expression2) {
+    List<String> ops = new ArrayList<String>();
+    List<INumberExpression> exprList = new ArrayList<INumberExpression>();
+    ops.add(opToken.getText());
+    exprList.add(expression1);
+    exprList.add(expression2);
+    return new ComposedNumberExpression(exprList, ops);
+  }
 
   public static AbstractStringExpression createSimpleStringExpression(Token 
token) {
     String text = token.getText();

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java
 Tue Aug  4 11:47:41 2015
@@ -37,6 +37,23 @@ public class RutaExpression extends Ruta
     if (annotation == null) {
       return Collections.emptyList();
     }
+    
+    // "autocast" to document annotation when mentioning document.
+    // This is either the actual document annotation or the current one in a 
block or inlined rule
+    AnnotationFS documentAnnotation = stream.getCas().getDocumentAnnotation();
+    Type docType = documentAnnotation.getType();
+    if(docType.equals(type)) {
+        List<AnnotationFS> result = new ArrayList<AnnotationFS>(1);
+        AnnotationFS windowAnnotation = 
stream.getFilter().getWindowAnnotation();
+        if(windowAnnotation == null) {
+          result.add(documentAnnotation);
+          return result;
+        } else {
+          result.add(windowAnnotation);
+          return result;
+        }
+    }
+    
     if (annotation.getType().equals(type)
             || stream.getCas().getTypeSystem().subsumes(type, 
annotation.getType())) {
       List<AnnotationFS> result = new ArrayList<AnnotationFS>(1);

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java
 Tue Aug  4 11:47:41 2015
@@ -76,7 +76,7 @@ public abstract class AbstractNumberExpr
       return t1 % t2;
     } else if ("EXP".equals(op)) {
       return Math.exp(t1);
-    } else if ("LOG".equals(op)) {
+    } else if ("LOGN".equals(op)) {
       return Math.log(t1);
     } else if ("SIN".equals(op)) {
       return Math.sin(t1);
@@ -84,6 +84,8 @@ public abstract class AbstractNumberExpr
       return Math.cos(t1);
     } else if ("TAN".equals(op)) {
       return Math.tan(t1);
+    } else if ("POW".equals(op)) {
+      return Math.pow(t1, t2);
     }
     return 0;
   }
@@ -109,6 +111,8 @@ public abstract class AbstractNumberExpr
       return (float) Math.cos(t1);
     } else if ("TAN".equals(op)) {
       return (float) Math.tan(t1);
+    } else if ("POW".equals(op)) {
+      return (float) Math.pow(t1, t2);
     }
     return 0;
   }
@@ -134,6 +138,8 @@ public abstract class AbstractNumberExpr
       return (int) Math.cos(t1);
     } else if ("TAN".equals(op)) {
       return (int) Math.tan(t1);
+    } else if ("POW".equals(op)) {
+      return (int) Math.pow(t1, t2);
     }
     return 0;
   }

Modified: 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java
 Tue Aug  4 11:47:41 2015
@@ -31,7 +31,7 @@ public class ParseTest {
     CAS cas = RutaTestUtils.processTestScript(this.getClass());
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 5, "42", "2", "1", "2", "3");
-    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "2,1");
+    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");

Modified: 
uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta
 Tue Aug  4 11:47:41 2015
@@ -8,6 +8,7 @@ STRING s1;
 DECLARE T1, T2, T3, T4;
 
 NUM{PARSE(i1) -> MARK(T1)};
-(NUM PM NUM){PARSE(d1), IF((d1==2.1)) -> MARK(T2)};
+(NUM PM NUM){PARSE(d1, "de"), IF((d1==2.1)) -> MARK(T2)};
+(NUM PM NUM){PARSE(d1, "en"), IF((d1==2.3)) -> MARK(T2)};
 W{PARSE(b1), IF(b1) -> MARK(T3)};
 ANY+{PARSE(s1), -PARTOF(T4), -PARTOF(SEMICOLON) -> MARK(T4)};
\ No newline at end of file

Modified: 
uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml 
(original)
+++ uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml 
Tue Aug  4 11:47:41 2015
@@ -615,7 +615,7 @@
         <emphasis role="bold">Definition:</emphasis>
       </title>
       <para>
-        <programlisting><![CDATA[PARSE(variable)]]></programlisting>
+        <programlisting><![CDATA[PARSE(variable(, 
stringExpression)?)]]></programlisting>
       </para>
     </section>
     <section>
@@ -623,10 +623,10 @@
         <emphasis role="bold">Example:</emphasis>
       </title>
       <para>
-        <programlisting><![CDATA[NUM{PARSE(var)};]]></programlisting>
+        <programlisting><![CDATA[NUM{PARSE(var,"de")};]]></programlisting>
       </para>
       <para>
-        If the variable 'var' is of an appropriate numeric type, the
+        If the variable 'var' is of an appropriate numeric type for the locale 
"de", the
         value of NUM is parsed and subsequently stored in 'var'.
       </para>
     </section>

Modified: 
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g
 (original)
+++ 
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g
 Tue Aug  4 11:47:41 2015
@@ -366,6 +366,7 @@ LOGN  : 'LOGN';
 SIN : 'SIN';
 COS : 'COS';
 TAN : 'TAN';
+POW : 'POW';
 XOR :   'XOR';
 TRUE  : 'true';
 FALSE   : 'false';

Modified: 
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
 (original)
+++ 
uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
 Tue Aug  4 11:47:41 2015
@@ -1329,8 +1329,8 @@ conditionFeature returns [RutaCondition
 conditionParse returns [RutaCondition cond = null]
     :
     name = PARSE LPAREN
-     var=genericVariableReference 
-    {cond = ConditionFactory.createCondition(name, var);}
+     var=genericVariableReference (COMMA locale = stringExpression)?
+    {cond = ConditionFactory.createCondition(name, var, locale);}
     RPAREN
     ;
 
@@ -2349,6 +2349,8 @@ numberFunction returns [Expression expr
        :
        (op=(EXP | LOGN | SIN | COS | TAN) numExprP=numberExpressionInPar)
        {expr = ExpressionFactory.createUnaryArithmeticExpr(numExprP,op);}
+       | op = POW LPAREN n1 = numberExpression COMMA n2 = numberExpression 
RPAREN
+       {expr = ExpressionFactory.createBinaryArithmeticExpr(n1, n2, op);}
        //| {root = ExpressionFactory.createNumberFunction(numExprP,op)}
        | (e = externalNumberFunction)=> e = externalNumberFunction {expr = e;}
        ;

Modified: 
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java
 Tue Aug  4 11:47:41 2015
@@ -44,7 +44,7 @@ public class RutaKeywords implements IRu
 
   private static String[] booleanFunction = { "true", "false" };
 
-  private static String[] numberFunction = { "EXP", "SIN", "COS", "TAN", 
"LOGN" };
+  private static String[] numberFunction = { "EXP", "SIN", "COS", "TAN", 
"LOGN" , "POW" };
 
   private static String[] stringFunction = { "REMOVESTRING" };
 

Modified: 
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java?rev=1694033&r1=1694032&r2=1694033&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java
 Tue Aug  4 11:47:41 2015
@@ -245,6 +245,9 @@ public class ExpressionFactory extends A
       case RutaLexer.MINUS:
         operatorID = ExpressionConstants.E_MINUS;
         break;
+      case RutaLexer.POW:
+        operatorID = ExpressionConstants.E_POWER;
+        break;
       default:
         break;
     }


Reply via email to