You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2020/03/22 21:17:36 UTC

svn commit: r1875525 - 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/test/java/org/apache/uima/ruta/condition/ ruta-docbook/src/docbook/ ruta-ep-ide/src...

Author: pkluegl
Date: Sun Mar 22 21:17:36 2020
New Revision: 1875525

URL: http://svn.apache.org/viewvc?rev=1875525&view=rev
Log:
UIMA-6171: optional argument for providing string that should be parsed

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/condition/ConditionFactory.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java
    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/RutaParser.g

Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1875525&r1=1875524&r2=1875525&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 Sun Mar 22 21:17:36 2020
@@ -184,6 +184,11 @@ public void setExternalFactory(RutaExter
     	      String msg = "Error in "+name+",  line " + line + ", \"" + text + "\": missing " + stringMissing
                     + ", but found " + stringFound;
     	      emitErrorMessage(msg);
+    	    } else if (e instanceof FailedPredicateException) {
+	      FailedPredicateException fpe = (FailedPredicateException) e;
+	      String msg = "Error in " + name + ",  line " + line + ", \"" + text + "\": Failed predicate: "
+	              + fpe.predicateText;
+	      emitErrorMessage(msg);
 	    } else {
 	      emitErrorMessage(e.getMessage());
 	    }
@@ -1707,11 +1712,19 @@ conditionFeature returns [AbstractRutaCo
     ;   
 
 conditionParse returns [AbstractRutaCondition cond = null]
-    :
-    PARSE LPAREN {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier 
+options {
+	backtrack = true;
+}   :
+    PARSE LPAREN
+    ( 
+    se = stringExpression COMMA
+    {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier 
+    |
+    {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier 
+    )
     (COMMA locale = stringExpression)?
     RPAREN
-    {cond = conditionFactory.createConditionParse(id, locale, $blockDeclaration::env);}
+    {cond = conditionFactory.createConditionParse(se, id, locale, $blockDeclaration::env);}
     ;
 
 conditionIs returns [AbstractRutaCondition cond = null]

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=1875525&r1=1875524&r2=1875525&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 Sun Mar 22 21:17:36 2020
@@ -256,8 +256,13 @@ public class ConditionFactory {
 
   public AbstractRutaCondition createConditionParse(Token id, IStringExpression localeExpr,
           RutaBlock env) {
+    return createConditionParse(null, id, localeExpr, env);
+  }
+
+  public AbstractRutaCondition createConditionParse(IStringExpression se, Token id,
+          IStringExpression localeExpr, RutaBlock env) {
     String var = id == null ? "" : id.getText();
-    return new ParseCondition(var, localeExpr);
+    return new ParseCondition(se, var, localeExpr);
   }
 
   public AbstractRutaCondition createConditionIs(ITypeExpression type,

Modified: uima/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=1875525&r1=1875524&r2=1875525&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 Sun Mar 22 21:17:36 2020
@@ -34,17 +34,24 @@ import org.apache.uima.ruta.visitor.Infe
 
 public class ParseCondition extends AbstractRutaCondition {
 
+  private IStringExpression stringExpression;
+
   private final String var;
 
   private IStringExpression localeExpr;
 
   public ParseCondition(String var) {
-    super();
-    this.var = var;
+    this(null, var, null);
   }
 
   public ParseCondition(String var, IStringExpression localeExpr) {
+    this(null, var, localeExpr);
+  }
+
+  public ParseCondition(IStringExpression stringExpression, String var,
+          IStringExpression localeExpr) {
     super();
+    this.stringExpression = stringExpression;
     this.var = var;
     this.localeExpr = localeExpr;
   }
@@ -53,12 +60,17 @@ public class ParseCondition extends Abst
   public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
     AnnotationFS annotation = context.getAnnotation();
 
-    if (annotation == null) {
+    if (stringExpression == null && annotation == null) {
       return new EvaluatedCondition(this, false);
     }
 
     RuleElement element = context.getElement();
-    String text = annotation.getCoveredText();
+    String text = "";
+    if (stringExpression != null) {
+      text = stringExpression.getStringValue(context, stream);
+    } else {
+      text = annotation.getCoveredText();
+    }
     RutaEnvironment env = element.getParent().getEnvironment();
     Class<?> type = env.getVariableType(var);
     NumberFormat nf = null;

Modified: uima/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=1875525&r1=1875524&r2=1875525&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 Sun Mar 22 21:17:36 2020
@@ -19,42 +19,86 @@
 
 package org.apache.uima.ruta.condition;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
 import org.apache.uima.cas.CAS;
 import org.apache.uima.ruta.engine.Ruta;
 import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;
 import org.junit.Test;
 
 public class ParseTest {
 
   @Test
   public void test() {
-    
+
     CAS cas = RutaTestUtils.processTestScript(this.getClass());
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 5, "42", "2", "1", "2", "3");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "2,1", "2.3");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "true");
-    RutaTestUtils.assertAnnotationsEquals(cas, 4, 5, "A Boolean b that is true", "b = false", "The Number 42",
-            "The Double d = 2,1", "Another Double that is 2.3");
+    RutaTestUtils.assertAnnotationsEquals(cas, 4, 5, "A Boolean b that is true", "b = false",
+            "The Number 42", "The Double d = 2,1", "Another Double that is 2.3");
 
     cas.release();
   }
-  
+
   @Test
   public void testDecimal() throws Exception {
-    
+
     CAS cas = RutaTestUtils.getCAS("text 2.3 text 2,3 text");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d),d==2.3 -> T1};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"en\"),d==2.3 -> T2};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"de\"),d==2.3 -> T3};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"en\"),d!=2.3 -> T4};");
     Ruta.apply(cas, "DOUBLE d; (NUM PM NUM){PARSE(d, \"de\"),d!=2.3 -> T5};");
-    
+
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "2.3");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "2.3");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "2,3");
     RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "2,3");
     RutaTestUtils.assertAnnotationsEquals(cas, 5, 1, "2.3");
   }
-  
+
+  @Test
+  public void testParseStringExpression() throws Exception {
+
+    String script = "";
+    script += "DOUBLE d;\n";
+
+    script += "Document{PARSE(\"1\", d)};\n";
+    script += "Document{d == 1 -> T1};\n";
+
+    script += "Document{PARSE(\"1\" + \"1\", d)};\n";
+    script += "Document{d == 11 -> T2};\n";
+
+    script += "Document{-> s:Struct, s.s=\"3\"};\n";
+    script += "s:Struct{PARSE(s.s, d)};\n";
+    script += "Document{d == 3 -> T3};\n";
+
+    script += "n:NUM{PARSE(n.ct, d)};\n";
+    script += "Document{d == 5 -> T4};\n";
+
+    Map<String, String> complexTypes = new HashMap<String, String>();
+    Map<String, List<TestFeature>> features = new TreeMap<String, List<TestFeature>>();
+    String typeName = "Struct";
+    complexTypes.put(typeName, "uima.tcas.Annotation");
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    features.put(typeName, list);
+    list.add(new TestFeature("s", "", CAS.TYPE_NAME_STRING));
+    CAS cas = RutaTestUtils.getCAS("test 5", complexTypes, features);
+
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "test 5");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "test 5");
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "test 5");
+    RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "test 5");
+
+  }
+
 }

Modified: uima/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=1875525&r1=1875524&r2=1875525&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 Sun Mar 22 21:17:36 2020
@@ -606,19 +606,20 @@
     <title>PARSE</title>
     <para>
       The PARSE condition is fulfilled, if the text covered by the
-      matched annotation can be transformed into a value of the given
+      matched annotation or the text defined by a optional first argument can be transformed into a value of the given
       variable's type. If this is possible, the parsed value is
       additionally assigned to the passed variable. For numeric values,
       this conditions delegates to the NumberFormat of the locale given by the optional
-      second argument. Therefore, this condition parses the string <quote>2,3</quote> for the locale
+      last argument. Therefore, this condition parses the string <quote>2,3</quote> for the locale
       <quote>en</quote> to the value 23.
+      
     </para>
     <section>
       <title>
         <emphasis role="bold">Definition:</emphasis>
       </title>
       <para>
-        <programlisting><![CDATA[PARSE(variable(, stringExpression)?)]]></programlisting>
+        <programlisting><![CDATA[PARSE((stringExpression,)? variable(, stringExpression)?)]]></programlisting>
       </para>
     </section>
     <section>
@@ -626,7 +627,8 @@
         <emphasis role="bold">Example:</emphasis>
       </title>
       <para>
-        <programlisting><![CDATA[NUM{PARSE(var,"de")};]]></programlisting>
+        <programlisting><![CDATA[NUM{PARSE(var,"de")};
+n:NUM{PARSE(n.ct,var,"de")};]]></programlisting>
       </para>
       <para>
         If the variable 'var' is of an appropriate numeric type for the locale "de", the

Modified: uima/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=1875525&r1=1875524&r2=1875525&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 Sun Mar 22 21:17:36 2020
@@ -1450,10 +1450,20 @@ conditionFeature returns [RutaCondition
     RPAREN
     ;   
 conditionParse returns [RutaCondition cond = null]
+  options {
+	backtrack = true;
+}
     :
     name = PARSE LPAREN
-     var=genericVariableReference (COMMA locale = stringExpression)?
+    (
+    se=stringExpression COMMA
+    var=genericVariableReference (COMMA locale = stringExpression)?
+    {cond = ConditionFactory.createCondition(name, se, var, locale);}
+    |
+    var=genericVariableReference (COMMA locale = stringExpression)?
     {cond = ConditionFactory.createCondition(name, var, locale);}
+    )
+   
     RPAREN
     ;