You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2015/08/04 13:47:42 UTC
svn commit: r1694033 - in /uima/ruta/trunk:
ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/
ruta-core/src/main/java/org/apache/uima/ruta/condition/
ruta-core/src/main/java/org/apache/uima/ruta/expression/
ruta-core/src/main/java/org/apache/uima/...
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;
}