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 2014/02/14 18:07:55 UTC

svn commit: r1568358 - in /uima/ruta/branches/UIMA-3569: example-projects/ruta-ep-example-extensions/ example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ example-projects/ruta-ep-example-extensions/src/tes...

Author: pkluegl
Date: Fri Feb 14 17:07:54 2014
New Revision: 1568358

URL: http://svn.apache.org/r1568358
Log:
UIMA-3569
- introduced concept for language extension of blocks in core and ide
- added exemplary block construct that applies the rules in inverse order
- added test

Added:
    uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlock.java   (with props)
    uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockExtension.java   (with props)
    uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockIDEExtension.java   (with props)
    uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/java/org/apache/uima/ruta/example/extensions/ExampleBlockTest.java   (with props)
    uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/ExampleBlockTest.ruta
    uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaBlockExtension.java   (with props)
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/blockExtension.exsd
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/extensions/IIDEBlockExtension.java   (with props)
Removed:
    uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/RutaAutomataBlock.java
    uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/RutaAutomataFactory.java
Modified:
    uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/plugin.xml
    uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/TestEngine.xml
    uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g
    uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
    uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/RutaBlock.java
    uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java
    uima/ruta/branches/UIMA-3569/ruta-ep-addons/src/main/java/org/apache/uima/ruta/query/ui/QueryActionHandler.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/plugin.xml
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/conditionExtension.exsd
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywordsManager.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaBlock.java
    uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ScriptFactory.java

Modified: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/plugin.xml
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/plugin.xml?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/plugin.xml (original)
+++ uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/plugin.xml Fri Feb 14 17:07:54 2014
@@ -61,5 +61,12 @@ under the License.
             engine="org.apache.uima.ruta.example.extensions.ExampleNumberFunctionExtension">
       </condition>
    </extension>
+   <extension
+         point="org.apache.uima.ruta.ide.blockExtension">
+      <block
+            class="org.apache.uima.ruta.example.extensions.ExampleBlockIDEExtension"
+            engine="org.apache.uima.ruta.example.extensions.ExampleBlockExtension">
+      </block>
+   </extension>
 
 </plugin>

Added: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlock.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlock.java?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlock.java (added)
+++ uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlock.java Fri Feb 14 17:07:54 2014
@@ -0,0 +1,89 @@
+/*
+ * 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.example.extensions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.BlockApply;
+import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.RutaStatement;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.ScriptApply;
+import org.apache.uima.ruta.rule.AbstractRule;
+import org.apache.uima.ruta.rule.AbstractRuleMatch;
+import org.apache.uima.ruta.rule.RuleApply;
+import org.apache.uima.ruta.rule.RuleMatch;
+import org.apache.uima.ruta.rule.RutaRule;
+import org.apache.uima.ruta.rule.RutaRuleElement;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+/**
+ * Exemplary implementation of a block extension, which applied its rules in reverse order.
+ *
+ */
+public class ExampleBlock extends RutaBlock {
+
+  public ExampleBlock(String name, RutaRule rule, List<RutaStatement> elements, RutaBlock parent,
+          String defaultNamespace) {
+    super(name, rule, elements, parent, defaultNamespace);
+  }
+
+  @Override
+  public ScriptApply apply(RutaStream stream, InferenceCrowd crowd) {
+    BlockApply result = new BlockApply(this);
+    crowd.beginVisit(this, result);
+    RuleApply apply = rule.apply(stream, crowd, true);
+    for (AbstractRuleMatch<? extends AbstractRule> eachMatch : apply.getList()) {
+      if (eachMatch.matched()) {
+        List<AnnotationFS> matchedAnnotations = ((RuleMatch) eachMatch).getMatchedAnnotations(null,
+                null);
+        if (matchedAnnotations == null || matchedAnnotations.isEmpty()) {
+          continue;
+        }
+        AnnotationFS each = matchedAnnotations.get(0);
+        if (each == null) {
+          continue;
+        }
+        List<Type> types = ((RutaRuleElement) rule.getRuleElements().get(0)).getMatcher().getTypes(
+                getParent() == null ? this : getParent(), stream);
+        for (Type eachType : types) {
+          RutaStream window = stream.getWindowStream(each, eachType);
+          List<RutaStatement> elements = new ArrayList<RutaStatement>(getElements());
+          Collections.reverse(elements);
+          for (RutaStatement element : elements) {
+            if (element != null) {
+              element.apply(window, crowd);
+            }
+          }
+        }
+      }
+    }
+    crowd.endVisit(this, result);
+    return result;
+  }
+
+
+
+
+}

Propchange: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlock.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockExtension.java?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockExtension.java (added)
+++ uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockExtension.java Fri Feb 14 17:07:54 2014
@@ -0,0 +1,68 @@
+/*
+ * 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.example.extensions;
+
+import java.util.List;
+
+import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.RutaElement;
+import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.extensions.IRutaBlockExtension;
+import org.apache.uima.ruta.extensions.RutaParseException;
+import org.apache.uima.ruta.verbalize.RutaVerbalizer;
+
+public class ExampleBlockExtension implements IRutaBlockExtension {
+
+  private final String[] knownExtensions = new String[] { "REVERSE" };
+
+  private final Class<?>[] extensions = new Class[] { ExampleBlock.class };
+
+  public String verbalize(RutaElement element, RutaVerbalizer verbalizer) {
+    if (element instanceof ExampleBlock) {
+      ExampleBlock b = (ExampleBlock) element;
+      String verbalize = verbalizer.verbalize(b, true);
+      verbalize.replaceFirst("BLOCK", verbalizeName(element));
+      return verbalize;
+    } else {
+      return "UnknownAction";
+    }
+  }
+
+  @Override
+  public RutaBlock createBlock(String name, List<RutaExpression> args, RutaBlock env)
+          throws RutaParseException {
+    return new ExampleBlock(name, null, null, env, name);
+  }
+
+
+  public String verbalizeName(RutaElement element) {
+    return knownExtensions[0];
+  }
+
+  public String[] getKnownExtensions() {
+    return knownExtensions;
+  }
+
+  public Class<?>[] extensions() {
+    return extensions;
+  }
+
+
+}

Propchange: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockIDEExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockIDEExtension.java?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockIDEExtension.java (added)
+++ uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockIDEExtension.java Fri Feb 14 17:07:54 2014
@@ -0,0 +1,41 @@
+/*
+ * 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.example.extensions;
+
+import org.antlr.runtime.RecognitionException;
+import org.apache.uima.ruta.ide.core.extensions.IIDEConditionExtension;
+import org.apache.uima.ruta.ide.core.extensions.IRutaCheckerProblemFactory;
+import org.eclipse.dltk.ast.expressions.Expression;
+import org.eclipse.dltk.compiler.problem.IProblemReporter;
+
+public class ExampleBlockIDEExtension implements IIDEConditionExtension {
+  private final String[] strings = new String[] { "REVERSE" };
+
+  public String[] getKnownExtensions() {
+    return strings;
+  }
+
+  public boolean checkSyntax(Expression element, IRutaCheckerProblemFactory problemFactory,
+          IProblemReporter rep) throws RecognitionException {
+    // do not add additional checks in this example
+    return false;
+  }
+
+}

Propchange: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/main/java/org/apache/uima/ruta/example/extensions/ExampleBlockIDEExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/java/org/apache/uima/ruta/example/extensions/ExampleBlockTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/java/org/apache/uima/ruta/example/extensions/ExampleBlockTest.java?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/java/org/apache/uima/ruta/example/extensions/ExampleBlockTest.java (added)
+++ uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/java/org/apache/uima/ruta/example/extensions/ExampleBlockTest.java Fri Feb 14 17:07:54 2014
@@ -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.example.extensions;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.FSIterator;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.cas.text.AnnotationIndex;
+import org.apache.uima.ruta.engine.RutaEngine;
+import org.junit.Test;
+
+public class ExampleBlockTest {
+
+  @Test
+  public void test() {
+    String name = this.getClass().getSimpleName();
+    String namespace = this.getClass().getPackage().getName().replaceAll("\\.", "/");
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.process(namespace + "/" + name + RutaEngine.SCRIPT_FILE_EXTENSION, namespace + "/test.txt", 50);
+    } catch (Exception e) {
+      e.printStackTrace();
+      assert (false);
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+
+    t = RutaTestUtils.getTestType(cas, 4);
+    ai = cas.getAnnotationIndex(t);
+    assertEquals(1, ai.size());
+    iterator = ai.iterator();
+    assertEquals("This is a test.", iterator.next().getCoveredText());
+
+    if (cas != null) {
+      cas.release();
+    }
+
+  }
+}

Propchange: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/java/org/apache/uima/ruta/example/extensions/ExampleBlockTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/ExampleBlockTest.ruta
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/ExampleBlockTest.ruta?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/ExampleBlockTest.ruta (added)
+++ uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/ExampleBlockTest.ruta Fri Feb 14 17:07:54 2014
@@ -0,0 +1,20 @@
+PACKAGE uima.ruta.example;
+
+DECLARE T1, T2, T3, T4;
+
+//This is a test.
+REVERSE Document{}{
+  (CW T3){-> T4};
+  (SW T2){-> T3};
+  (SW T1){-> T2};
+  (SW PERIOD){-> T1};
+}
+
+
+
+
+
+
+
+
+

Modified: uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/TestEngine.xml
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/TestEngine.xml?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/TestEngine.xml (original)
+++ uima/ruta/branches/UIMA-3569/example-projects/ruta-ep-example-extensions/src/test/resources/org/apache/uima/ruta/example/extensions/TestEngine.xml Fri Feb 14 17:07:54 2014
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
+
 <!--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
@@ -17,7 +18,6 @@
   specific language governing permissions and limitations
   under the License.
 -->
-
 <analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
   <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
   <primitive>true</primitive>
@@ -210,7 +210,8 @@
                   <string>org.apache.uima.ruta.example.extensions.ExampleNumberFunctionExtension</string>
                   <string>org.apache.uima.ruta.example.extensions.ExampleStringFunctionExtension</string>
                   <string>org.apache.uima.ruta.example.extensions.ExampleTypeFunctionExtension</string>
-              </array>
+              <string>org.apache.uima.ruta.example.extensions.ExampleBlockExtension</string>
+          </array>
           </value>
       </nameValuePair>
     </configurationParameterSettings>

Modified: uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g (original)
+++ uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g Fri Feb 14 17:07:54 2014
@@ -332,7 +332,6 @@ ScriptString	:	'SCRIPT';
 EngineString	:	'ENGINE';
 UimafitString	:	'UIMAFIT';
 BlockString 	:	'BLOCK';
-AutomataBlockString 	:	'RULES';
 TypeString 	:	'TYPE';
 IntString	:	'INT';
 DoubleString	:	'DOUBLE';

Modified: uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/ruta/branches/UIMA-3569/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Fri Feb 14 17:07:54 2014
@@ -56,13 +56,11 @@ import org.apache.uima.ruta.action.Abstr
 import org.apache.uima.ruta.action.ActionFactory;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
 import org.apache.uima.ruta.condition.ConditionFactory;
-import org.apache.uima.ruta.RutaAutomataBlock;
 import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.RutaEnvironment;
 import org.apache.uima.ruta.RutaModule;
 import org.apache.uima.ruta.RutaScriptBlock;
 import org.apache.uima.ruta.RutaScriptFactory;
-import org.apache.uima.ruta.RutaAutomataFactory;
 import org.apache.uima.ruta.RutaStatement;
 import org.apache.uima.ruta.expression.ExpressionFactory;
 import org.apache.uima.ruta.expression.IRutaExpression;
@@ -97,7 +95,6 @@ import org.apache.uima.ruta.rule.quantif
 private List vars = new ArrayList();	
 private int level = 0;
 private RutaScriptFactory factory = new RutaScriptFactory();
-private RutaScriptFactory automataFactory = new RutaAutomataFactory();
 private RutaExternalFactory external;
 private String namespace;
 private String moduleName;
@@ -302,6 +299,9 @@ public void setExternalFactory(RutaExter
       	private boolean isTypeFunctionExtension(String name) {
       	  return external.getTypeFunctionExtensions().keySet().contains(name);
       	}
+      	private boolean isBlockExtension(String name) {
+      	  return external.getBlockExtensions().keySet().contains(name);
+      	}
       	
 
 
@@ -367,7 +367,7 @@ statement returns [RutaStatement stmt = 
 	| stmtVariable = variableDeclaration {stmt = stmtVariable;}
 	| stmtRule = simpleStatement {stmt = stmtRule;}
 	| stmtBlock = blockDeclaration {stmt = stmtBlock;}
-	| stmtAutomata = automataDeclaration {stmt = stmtBlock;}
+	| stmtExternal = externalBlock {stmt = stmtExternal;}
 	)
 	;
 
@@ -556,7 +556,8 @@ level--;
 	}	
 	;
 
-automataDeclaration returns [RutaBlock block = null]
+
+externalBlock returns [RutaBlock block = null]
 options {
 	backtrack = true;
 }
@@ -567,37 +568,35 @@ scope {
 @init{
 RutaRuleElement re = null;
 RuleElementIsolator container = null;
-RutaScriptFactory oldFactory = factory;
-factory = automataFactory; 
 level++;
 }
 @after {
-factory = oldFactory;
 level--;
 }
 	:
-	
-	type = AutomataBlockString 
-	LPAREN
-	id = Identifier 
-	RPAREN
-	{block = factory.createAutomataBlock(id, re, body, $blockDeclaration[level - 1]::env);}
+	{isBlockExtension(input.LT(1).getText())}? 
+	type = Identifier 
+	(LPAREN
+	args = varArgumentList
+	RPAREN)?
+	{block = external.createExternalBlock(type, args, $blockDeclaration[level - 1]::env);}
 	{$blockDeclaration::env = block;
 	container = new RuleElementIsolator();}
+	
 	re1 = ruleElementWithCA[container] {re = re1;}
+	
 	{RutaRule rule = factory.createRule(re, block);
-	if(block instanceof RutaAutomataBlock) {
-	((RutaAutomataBlock)block).setMatchRule(rule);
-	}
-	container.setContainer(rule);
-	}
+	block.setRule(rule);
+	container.setContainer(rule);}
+	
 	LCURLY body = statements RCURLY
 	{block.setElements(body);
-	$blockDeclaration::env.getScript().addBlock(id.getText(),block);
-
+	// really needs to know of the block?
+	//$blockDeclaration::env.getScript().addBlock(type,block);
 	}	
 	;
 
+
 	
 ruleElementWithCA[RuleElementContainer container] returns [RutaRuleElement re = null] 
     :

Modified: uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/RutaBlock.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/RutaBlock.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/RutaBlock.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/RutaBlock.java Fri Feb 14 17:07:54 2014
@@ -93,4 +93,5 @@ public abstract class RutaBlock extends 
     return name;
   }
 
+ 
 }

Added: uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaBlockExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaBlockExtension.java?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaBlockExtension.java (added)
+++ uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaBlockExtension.java Fri Feb 14 17:07:54 2014
@@ -0,0 +1,32 @@
+/*
+ * 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.extensions;
+
+import java.util.List;
+
+import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.expression.RutaExpression;
+
+public interface IRutaBlockExtension extends IRutaExtension {
+
+  RutaBlock createBlock(String name, List<RutaExpression> args, RutaBlock env)
+          throws RutaParseException;
+  
+}

Propchange: uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaBlockExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java Fri Feb 14 17:07:54 2014
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.antlr.runtime.Token;
+import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
 import org.apache.uima.ruta.expression.RutaExpression;
@@ -46,6 +47,8 @@ public class RutaExternalFactory {
 
   private Map<String, IRutaNumberFunctionExtension> numberFunctionExtensions;
 
+  private Map<String, IRutaBlockExtension> blockExtensions;
+
   public RutaExternalFactory() {
     super();
     conditionExtensions = new HashMap<String, IRutaConditionExtension>();
@@ -54,6 +57,7 @@ public class RutaExternalFactory {
     stringFunctionExtensions = new HashMap<String, IRutaStringFunctionExtension>();
     numberFunctionExtensions = new HashMap<String, IRutaNumberFunctionExtension>();
     typeFunctionExtensions = new HashMap<String, IRutaTypeFunctionExtension>();
+    blockExtensions = new HashMap<String, IRutaBlockExtension>();
   }
 
   public AbstractRutaCondition createExternalCondition(Token id, List<RutaExpression> args)
@@ -122,6 +126,20 @@ public class RutaExternalFactory {
     return null;
   }
 
+  public RutaBlock createExternalBlock(Token type, List<RutaExpression> args, RutaBlock env)
+          throws RutaParseException {
+		if(type == null) {
+		  return null;
+		}
+		String t = type.getText();
+		IRutaBlockExtension extension = blockExtensions.get(t);
+		if(extension != null) {
+		  return extension.createBlock(t, args, env);
+		}
+		return null;
+	}
+  
+  
   public void addExtension(String id, IRutaExtension extension) {
     if (extension instanceof IRutaActionExtension) {
       addActionExtension(id, (IRutaActionExtension) extension);
@@ -135,6 +153,8 @@ public class RutaExternalFactory {
       addNumberFunctionExtension(id, (IRutaNumberFunctionExtension) extension);
     } else if (extension instanceof IRutaTypeFunctionExtension) {
       addTypeFunctionExtension(id, (IRutaTypeFunctionExtension) extension);
+    } else if (extension instanceof IRutaBlockExtension) {
+      addBlockExtension(id, (IRutaBlockExtension) extension);
     }
   }
 
@@ -161,6 +181,10 @@ public class RutaExternalFactory {
   public void addTypeFunctionExtension(String id, IRutaTypeFunctionExtension extension) {
     typeFunctionExtensions.put(id, extension);
   }
+  
+  public void addBlockExtension(String id, IRutaBlockExtension extension) {
+    blockExtensions.put(id, extension);
+  }
 
   public boolean isInitialized() {
     return !actionExtensions.isEmpty() || !conditionExtensions.isEmpty()
@@ -194,8 +218,8 @@ public class RutaExternalFactory {
 
   public Map<String, IRutaTypeFunctionExtension> getTypeFunctionExtensions() {
     return typeFunctionExtensions;
-  }
-
+  }  
+  
   public void setTypeFunctionExtensions(Map<String, IRutaTypeFunctionExtension> typeFunctionExtensions) {
     this.typeFunctionExtensions = typeFunctionExtensions;
   }
@@ -215,5 +239,14 @@ public class RutaExternalFactory {
   public void setConditionExtensions(Map<String, IRutaConditionExtension> conditionExtensions) {
     this.conditionExtensions = conditionExtensions;
   }
+  
+  public Map<String, IRutaBlockExtension> getBlockExtensions() {
+    return blockExtensions;
+  }
+
+  public void setBlockExtensions(Map<String, IRutaBlockExtension> blockExtensions) {
+    this.blockExtensions = blockExtensions;
+  }
+
 
 }

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-addons/src/main/java/org/apache/uima/ruta/query/ui/QueryActionHandler.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-addons/src/main/java/org/apache/uima/ruta/query/ui/QueryActionHandler.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-addons/src/main/java/org/apache/uima/ruta/query/ui/QueryActionHandler.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-addons/src/main/java/org/apache/uima/ruta/query/ui/QueryActionHandler.java Fri Feb 14 17:07:54 2014
@@ -48,6 +48,7 @@ import org.apache.uima.resource.metadata
 import org.apache.uima.ruta.addons.RutaAddonsPlugin;
 import org.apache.uima.ruta.engine.RutaEngine;
 import org.apache.uima.ruta.extensions.IRutaActionExtension;
+import org.apache.uima.ruta.extensions.IRutaBlockExtension;
 import org.apache.uima.ruta.extensions.IRutaBooleanFunctionExtension;
 import org.apache.uima.ruta.extensions.IRutaConditionExtension;
 import org.apache.uima.ruta.extensions.IRutaNumberFunctionExtension;
@@ -214,6 +215,8 @@ public class QueryActionHandler implemen
                 .getRutaStringFunctionExtensions();
         IRutaTypeFunctionExtension[] typeFunctionExtensions = RutaExtensionManager.getDefault()
                 .getRutaTypeFunctionExtensions();
+        IRutaBlockExtension[] blockExtensions = RutaExtensionManager.getDefault()
+                .getRutaBlockExtensions();
 
         List<String> languageExtensions = new ArrayList<String>();
 
@@ -235,6 +238,9 @@ public class QueryActionHandler implemen
         for (IRutaTypeFunctionExtension each : typeFunctionExtensions) {
           languageExtensions.add(each.getClass().getName());
         }
+        for (IRutaBlockExtension each : blockExtensions) {
+          languageExtensions.add(each.getClass().getName());
+        }
         ae.setConfigParameterValue(RutaEngine.PARAM_ADDITIONAL_EXTENSIONS,
                 languageExtensions.toArray(new String[0]));
 

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java Fri Feb 14 17:07:54 2014
@@ -50,6 +50,7 @@ import org.apache.uima.ruta.ide.core.Rut
 import org.apache.uima.ruta.ide.core.RutaKeywordsManager;
 import org.apache.uima.ruta.ide.core.builder.RutaProjectUtils;
 import org.apache.uima.ruta.ide.core.extensions.IIDEActionExtension;
+import org.apache.uima.ruta.ide.core.extensions.IIDEBlockExtension;
 import org.apache.uima.ruta.ide.core.extensions.IIDEBooleanFunctionExtension;
 import org.apache.uima.ruta.ide.core.extensions.IIDEConditionExtension;
 import org.apache.uima.ruta.ide.core.extensions.IIDENumberFunctionExtension;
@@ -119,6 +120,8 @@ public class LanguageCheckerVisitor exte
 
   private Map<String, IIDETypeFunctionExtension> typeFunctionExtensions;
 
+  private Map<String, IIDEBlockExtension> blockExtensions;
+  
   /**
    * Mapping from short type name (e.g. {@code W}) to their disambiguated long type names (e.g.
    * {@code org.apache.uima.ruta.type.W}).
@@ -179,6 +182,8 @@ public class LanguageCheckerVisitor exte
 
   private String parentTypeInDeclaration;
 
+
+
   public LanguageCheckerVisitor(IProblemReporter problemReporter, ISourceLineTracker linetracker,
           ISourceModule sourceModule) {
     super();
@@ -748,8 +753,11 @@ public class LanguageCheckerVisitor exte
     if (s instanceof RutaBlock) {
       RutaBlock b = (RutaBlock) s;
       knownLocalVariables.push(new HashMap<String, Integer>());
-      blocks.push(b.getName());
+      String name = b.getName();
+      blocks.push(name);
+      // TODO add syntax check for block extensions
     }
+    
     return true;
   }
 
@@ -1011,6 +1019,15 @@ public class LanguageCheckerVisitor exte
         typeFunctionExtensions.put(string, each);
       }
     }
+    IIDEBlockExtension[] bextensions = RutaExtensionManager.getDefault()
+            .getIDEBlockExtensions();
+    for (IIDEBlockExtension each : bextensions) {
+      String[] knownExtensions = each.getKnownExtensions();
+      for (String string : knownExtensions) {
+        blockExtensions.put(string, each);
+      }
+    }
+    
 
   }
 

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/plugin.xml
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/plugin.xml?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/plugin.xml (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/plugin.xml Fri Feb 14 17:07:54 2014
@@ -34,6 +34,7 @@ under the License.
    <extension-point id="stringFunctionExtension" name="stringFunctionExtension" schema="schema/stringFunctionExtension.exsd"/>
    <extension-point id="rutaSemanticHighlighting" name="rutaSemanticHighlighting" schema="schema/rutaSemanticHighlighting.exsd"/>
    <extension-point id="rutaTestEngine" name="rutaTestEngine" schema="schema/rutaTestEngine.exsd"/>
+   <extension-point id="blockExtension" name="blockExtension" schema="schema/blockExtension.exsd"/>
    <extension
          id="nature"
          point="org.eclipse.core.resources.natures">

Added: uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/blockExtension.exsd
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/blockExtension.exsd?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/blockExtension.exsd (added)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/blockExtension.exsd Fri Feb 14 17:07:54 2014
@@ -0,0 +1,112 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.apache.uima.ruta.ide" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.apache.uima.ruta.ide" id="blockExtension" name="blockExtension"/>
+      </appinfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="block" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="block">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.apache.uima.ruta.ide.core.extensions.IIDEBlockExtension"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="engine" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.apache.uima.ruta.extensions.IRutaBlockExtension"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="implementation"/>
+      </appinfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/conditionExtension.exsd
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/conditionExtension.exsd?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/conditionExtension.exsd (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/schema/conditionExtension.exsd Fri Feb 14 17:07:54 2014
@@ -1,27 +1,9 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!--
-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.
--->
-
+<!-- Schema file written by PDE -->
 <schema targetNamespace="org.apache.uima.ruta.ide" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
       <appinfo>
-         <meta.schema plugin="org.apache.uima.ruta.ruta.ide" id="conditionExtension" name="conditionExtension"/>
+         <meta.schema plugin="org.apache.uima.ruta.ide" id="conditionExtension" name="conditionExtension"/>
       </appinfo>
       <documentation>
          [Enter description of this extension point.]
@@ -73,7 +55,7 @@ under the License.
                   
                </documentation>
                <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.apache.uima.ruta.ruta.ide.core.extensions.IIDEConditionExtension"/>
+                  <meta.attribute kind="java" basedOn=":org.apache.uima.ruta.ide.core.extensions.IIDEConditionExtension"/>
                </appinfo>
             </annotation>
          </attribute>

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g Fri Feb 14 17:07:54 2014
@@ -331,7 +331,6 @@ ScriptString  : 'SCRIPT';
 EngineString  : 'ENGINE';
 UimafitString : 'UIMAFIT';
 BlockString   : 'BLOCK';
-AutomataBlockString   : 'RULES';
 TypeString  : 'TYPE';
 IntString : 'INT';
 DoubleString  : 'DOUBLE';

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Fri Feb 14 17:07:54 2014
@@ -28,6 +28,7 @@ options {
 
 package org.apache.uima.ruta.ide.core.parser;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -85,6 +86,7 @@ import org.apache.uima.ruta.ide.parser.a
 	private Map<String, String> varTypeMap = new HashMap<String, String>();
 	private Map<String, String> lists = new HashMap<String, String>();
 	private Map<String, String> tables = new HashMap<String, String>();
+	private Collection<String> knownExternalBlocks = new ArrayList();
 	public int length;
 	public DLTKTokenConverter converter;
 	public DescriptorManager descriptor;
@@ -96,6 +98,14 @@ import org.apache.uima.ruta.ide.parser.a
 	
 	private ScriptFactory scriptFactory = new ScriptFactory();
 	
+	public void setKnownExternalBlocks(Collection<String> knownExternalBlocks) {
+		this.knownExternalBlocks = knownExternalBlocks;
+	}
+	
+	private boolean isBlockExtension(String name) {
+		return knownExternalBlocks.contains(name);
+	}
+	
 	public List<String> getVariables() {
 		return vars;
 	}
@@ -301,7 +311,7 @@ statement returns [List<Statement> stmts
 	( stmts1 = declaration {stmts.addAll(stmts1);}
 	| stmtVariable = variableDeclaration {stmts.addAll(stmtVariable);}
 	| stmt3 = blockDeclaration {stmts.add(stmt3);}
-	//| stmt4 = tmRule {stmts.add(stmt4);}
+	| (externalBlock)=> stmt4 = externalBlock {stmts.add(stmt4);}
 	| stmt2 = simpleStatement {stmts.add(stmt2);}
 	
 
@@ -551,7 +561,7 @@ level--;
 }
 	:
 
-	(declareToken = BlockString | declareToken = AutomataBlockString)
+	(declareToken = BlockString)
 	LPAREN
 	id = Identifier {addVariable(id.getText(), declareToken.getText());}
 	{
@@ -562,11 +572,38 @@ level--;
 	re1 = ruleElementWithCA
 	{
 	rule = scriptFactory.createRule(re1);
-	scriptFactory.finalizeScriptBlock(block, rc, rule, body);}
+	scriptFactory.finalizeBlock(block, rc, rule, body);}
 	LCURLY body = statements rc = RCURLY
-	{scriptFactory.finalizeScriptBlock(block, rc, rule, body);}
+	{scriptFactory.finalizeBlock(block, rc, rule, body);}
 	;
 
+externalBlock returns [RutaBlock block = null]
+options{
+	backtrack = true;
+}
+
+@init{
+RutaRule rule = null;
+
+}
+@after {
+
+}
+	:
+	{isBlockExtension(input.LT(1).getText())}? 
+	(type = Identifier)
+	{block = scriptFactory.createExternalBlock(type, $blockDeclaration[level]::env);
+		$blockDeclaration::env = block;}
+	(LPAREN
+	args = varArgumentList  {block.setArguments(args);}
+	RPAREN)?
+	re1 = ruleElementWithCA
+	{
+	rule = scriptFactory.createRule(re1);
+	scriptFactory.finalizeBlock(block, rc, rule, body);}
+	LCURLY body = statements rc = RCURLY
+	{scriptFactory.finalizeBlock(block, rc, rule, body);}
+	;
 	
 ruleElementWithCA returns [RutaRuleElement re = null] 
     :

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java Fri Feb 14 17:07:54 2014
@@ -25,6 +25,7 @@ import java.util.List;
 
 import org.apache.uima.ruta.extensions.IEngineLoader;
 import org.apache.uima.ruta.extensions.IRutaActionExtension;
+import org.apache.uima.ruta.extensions.IRutaBlockExtension;
 import org.apache.uima.ruta.extensions.IRutaBooleanFunctionExtension;
 import org.apache.uima.ruta.extensions.IRutaConditionExtension;
 import org.apache.uima.ruta.extensions.IRutaNumberFunctionExtension;
@@ -33,6 +34,7 @@ import org.apache.uima.ruta.extensions.I
 import org.apache.uima.ruta.ide.RutaIdeCorePlugin;
 import org.apache.uima.ruta.ide.core.extensions.ICompletionExtension;
 import org.apache.uima.ruta.ide.core.extensions.IIDEActionExtension;
+import org.apache.uima.ruta.ide.core.extensions.IIDEBlockExtension;
 import org.apache.uima.ruta.ide.core.extensions.IIDEBooleanFunctionExtension;
 import org.apache.uima.ruta.ide.core.extensions.IIDEConditionExtension;
 import org.apache.uima.ruta.ide.core.extensions.IIDENumberFunctionExtension;
@@ -269,6 +271,27 @@ public class RutaExtensionManager {
     return result.toArray(new IIDETypeFunctionExtension[0]);
   }
 
+  public IIDEBlockExtension[] getIDEBlockExtensions() {
+    Collection<IIDEBlockExtension> result = new ArrayList<IIDEBlockExtension>();
+    IExtension[] blockExtensions = Platform.getExtensionRegistry()
+            .getExtensionPoint(RutaIdeCorePlugin.PLUGIN_ID, "blockExtension").getExtensions();
+    for (IExtension extension : blockExtensions) {
+      IConfigurationElement[] configurationElements = extension.getConfigurationElements();
+      for (IConfigurationElement configurationElement : configurationElements) {
+        Object obj = null;
+        try {
+          obj = configurationElement.createExecutableExtension("class");
+        } catch (CoreException e) {
+          e.printStackTrace();
+        }
+        if (obj instanceof IIDEBlockExtension) {
+          result.add((IIDEBlockExtension) obj);
+        }
+      }
+    }
+    return result.toArray(new IIDEBlockExtension[0]);
+  }
+  
   public IRutaConditionExtension[] getRutaConditionExtensions() {
     Collection<IRutaConditionExtension> result = new ArrayList<IRutaConditionExtension>();
     IExtension[] conditionExtensions = Platform.getExtensionRegistry()
@@ -394,6 +417,27 @@ public class RutaExtensionManager {
     }
     return result.toArray(new IRutaTypeFunctionExtension[0]);
   }
+  
+  public IRutaBlockExtension[] getRutaBlockExtensions() {
+    Collection<IRutaBlockExtension> result = new ArrayList<IRutaBlockExtension>();
+    IExtension[] extensions = Platform.getExtensionRegistry()
+            .getExtensionPoint(RutaIdeCorePlugin.PLUGIN_ID, "blockExtension").getExtensions();
+    for (IExtension extension : extensions) {
+      IConfigurationElement[] configurationElements = extension.getConfigurationElements();
+      for (IConfigurationElement configurationElement : configurationElements) {
+        Object obj = null;
+        try {
+          obj = configurationElement.createExecutableExtension("engine");
+        } catch (CoreException e) {
+          e.printStackTrace();
+        }
+        if (obj instanceof IRutaBlockExtension) {
+          result.add((IRutaBlockExtension) obj);
+        }
+      }
+    }
+    return result.toArray(new IRutaBlockExtension[0]);
+  }
 
   public IEngineLoader[] getEngineExtensions() {
     Collection<IEngineLoader> result = new ArrayList<IEngineLoader>();

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java Fri Feb 14 17:07:54 2014
@@ -28,7 +28,7 @@ public class RutaKeywords implements IRu
 
   private static String[] declaration = { "WORDLIST", "DECLARE", "BOOLEAN", "PACKAGE", "TYPE",
       "TYPESYSTEM", "INT", "DOUBLE", "FLOAT", "STRING", "SCRIPT", "WORDTABLE", "ENGINE", "BLOCK",
-      "RULES", "BOOLEANLIST", "INTLIST", "DOUBLELIST", "FLOATLIST", "STRINGLIST", "TYPELIST",
+      "BOOLEANLIST", "INTLIST", "DOUBLELIST", "FLOATLIST", "STRINGLIST", "TYPELIST",
       "UIMAFIT", "IMPORT" , "FROM", "AS" };
 
   private static String[] action = { "DEL", "CALL", "MARK", "MARKSCORE", "COLOR", "LOG", "REPLACE",

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywordsManager.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywordsManager.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywordsManager.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywordsManager.java Fri Feb 14 17:07:54 2014
@@ -20,6 +20,7 @@
 package org.apache.uima.ruta.ide.core;
 
 import org.apache.uima.ruta.extensions.IRutaActionExtension;
+import org.apache.uima.ruta.extensions.IRutaBlockExtension;
 import org.apache.uima.ruta.extensions.IRutaBooleanFunctionExtension;
 import org.apache.uima.ruta.extensions.IRutaConditionExtension;
 import org.apache.uima.ruta.extensions.IRutaNumberFunctionExtension;
@@ -107,6 +108,13 @@ public final class RutaKeywordsManager {
       all[IRutaKeywords.TYPEFUNCTION] = RutaKeywords.append(all[IRutaKeywords.TYPEFUNCTION],
               knownExtensions);
     }
+    IRutaBlockExtension[] blockExtensions = RutaExtensionManager.getDefault()
+            .getRutaBlockExtensions();
+    for (IRutaBlockExtension each : blockExtensions) {
+      String[] knownExtensions = each.getKnownExtensions();
+      all[IRutaKeywords.DECLARATION] = RutaKeywords.append(all[IRutaKeywords.DECLARATION],
+              knownExtensions);
+    }
   }
 
   public static String[] getKeywords() {

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java Fri Feb 14 17:07:54 2014
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.uima.ruta.engine.RutaEngine;
 import org.apache.uima.ruta.extensions.IEngineLoader;
 import org.apache.uima.ruta.extensions.IRutaActionExtension;
+import org.apache.uima.ruta.extensions.IRutaBlockExtension;
 import org.apache.uima.ruta.extensions.IRutaBooleanFunctionExtension;
 import org.apache.uima.ruta.extensions.IRutaConditionExtension;
 import org.apache.uima.ruta.extensions.IRutaNumberFunctionExtension;
@@ -193,6 +194,8 @@ public class RutaBuilder extends Abstrac
             .getRutaStringFunctionExtensions();
     IRutaTypeFunctionExtension[] typeFunctionExtensions = RutaExtensionManager.getDefault()
             .getRutaTypeFunctionExtensions();
+    IRutaBlockExtension[] blockExtensions = RutaExtensionManager.getDefault()
+            .getRutaBlockExtensions();
     IEngineLoader[] engineExtensions = RutaExtensionManager.getDefault().getEngineExtensions();
 
     List<String> language = new ArrayList<String>();
@@ -216,6 +219,9 @@ public class RutaBuilder extends Abstrac
     for (IRutaTypeFunctionExtension each : typeFunctionExtensions) {
       language.add(each.getClass().getName());
     }
+    for (IRutaBlockExtension each : blockExtensions) {
+      language.add(each.getClass().getName());
+    }
     for (IEngineLoader each : engineExtensions) {
       engines.add(each.getClass().getName());
     }

Added: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/extensions/IIDEBlockExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/extensions/IIDEBlockExtension.java?rev=1568358&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/extensions/IIDEBlockExtension.java (added)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/extensions/IIDEBlockExtension.java Fri Feb 14 17:07:54 2014
@@ -0,0 +1,24 @@
+/*
+ * 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.ide.core.extensions;
+
+public interface IIDEBlockExtension extends IRutaExtension {
+
+}

Propchange: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/extensions/IIDEBlockExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java Fri Feb 14 17:07:54 2014
@@ -20,6 +20,9 @@
 package org.apache.uima.ruta.ide.core.parser;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -28,7 +31,10 @@ import org.antlr.runtime.CharStream;
 import org.antlr.runtime.CommonTokenStream;
 import org.antlr.runtime.Token;
 import org.apache.uima.ruta.engine.RutaEngine;
+import org.apache.uima.ruta.extensions.IRutaBlockExtension;
 import org.apache.uima.ruta.ide.core.IRutaKeywords;
+import org.apache.uima.ruta.ide.core.RutaExtensionManager;
+import org.apache.uima.ruta.ide.core.RutaKeywords;
 import org.apache.uima.ruta.ide.core.RutaKeywordsManager;
 import org.apache.uima.ruta.ide.core.builder.DescriptorManager;
 import org.apache.uima.ruta.ide.parser.ast.RutaModuleDeclaration;
@@ -108,6 +114,14 @@ public class RutaSourceParser extends Ab
       variables.add(each);
       variableTypes.put(each, "TYPEFUNCTION");
     }
+    Collection<String> knownExternalBlocks = new ArrayList<String>();
+    IRutaBlockExtension[] blockExtensions = RutaExtensionManager.getDefault()
+            .getRutaBlockExtensions();
+    for (IRutaBlockExtension each : blockExtensions) {
+      String[] knownExtensions = each.getKnownExtensions();
+      knownExternalBlocks.addAll(Arrays.asList(knownExtensions));
+    }
+    parser.setKnownExternalBlocks(knownExternalBlocks);
     parser.addPredefinedType("Document");
     parser.addPredefinedType("Annotation");
 

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaBlock.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaBlock.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaBlock.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaBlock.java Fri Feb 14 17:07:54 2014
@@ -19,9 +19,12 @@
 
 package org.apache.uima.ruta.ide.parser.ast;
 
+import java.util.List;
+
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.dltk.ast.ASTVisitor;
 import org.eclipse.dltk.ast.declarations.MethodDeclaration;
+import org.eclipse.dltk.ast.expressions.Expression;
 
 public class RutaBlock extends MethodDeclaration {
 
@@ -29,6 +32,8 @@ public class RutaBlock extends MethodDec
 
   private String namespace;
 
+  private List<Expression> args;
+
   public RutaBlock(String name, String namespace, int nameStart, int nameEnd, int declStart,
           int declEnd) {
     super(name, nameStart, nameEnd, declStart, declEnd);
@@ -46,6 +51,11 @@ public class RutaBlock extends MethodDec
       if (rule != null) {
         rule.traverse(visitor);
       }
+      if(args != null) {
+        for (Expression each : args) {
+          each.traverse(visitor);
+        }
+      }
       traverseChildNodes(visitor);
       visitor.endvisit(this);
     }
@@ -69,4 +79,10 @@ public class RutaBlock extends MethodDec
   public String toString() {
     return this.getClass().getSimpleName() + " : " + super.toString();
   }
+
+
+  public void setArguments(List<Expression> args) {
+    this.args = args;
+    
+  }
 }

Modified: uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ScriptFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ScriptFactory.java?rev=1568358&r1=1568357&r2=1568358&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ScriptFactory.java (original)
+++ uima/ruta/branches/UIMA-3569/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ScriptFactory.java Fri Feb 14 17:07:54 2014
@@ -39,8 +39,7 @@ public class ScriptFactory extends Abstr
   public void resetRuleCounter() {
     idCounter = 0;
   }
-  
-  
+
   public RutaRule createRule(RutaRuleElement element) {
     List<Expression> elements = new ArrayList<Expression>();
     elements.add(element);
@@ -49,7 +48,7 @@ public class ScriptFactory extends Abstr
 
   public RutaRule createRule(List<Expression> elements, Token s, boolean updateCounter) {
     RutaRule rule = new RutaRule(elements, idCounter);
-    if(updateCounter) {
+    if (updateCounter) {
       idCounter++;
     }
     if (s != null) {
@@ -58,7 +57,7 @@ public class ScriptFactory extends Abstr
     }
     return rule;
   }
-  
+
   public RutaRule createRule(List<Expression> elements, Token s) {
     return createRule(elements, s, true);
   }
@@ -152,7 +151,7 @@ public class ScriptFactory extends Abstr
     filterNullObjects(c);
     filterNullObjects(a);
     RutaRuleElement rutaRuleElement = new RutaRuleElement(bounds[0], bounds[1], null, null, c, a);
-    if(w != null && w.getText().equals("#")) {
+    if (w != null && w.getText().equals("#")) {
       rutaRuleElement.setWildcard(true);
     }
     return rutaRuleElement;
@@ -184,7 +183,7 @@ public class ScriptFactory extends Abstr
    * @param id
    * @param type
    * @param rutaBlock
-   * @return
+   * @return RutaBlock
    */
   public RutaBlock createScriptBlock(Token id, Token type, RutaBlock rutaBlock) {
     int[] bounds = getBounds(type, id);
@@ -200,7 +199,21 @@ public class ScriptFactory extends Abstr
     }
   }
 
-  public void finalizeScriptBlock(RutaBlock block, Token rc, RutaRule rule, List<Statement> body) {
+  /**
+   * Creates an AST element for an external block construct
+   * @param type
+   * @param parent block
+   * @return new external block construct
+   */
+  public RutaBlock createExternalBlock(Token type, RutaBlock env) {
+    int[] bounds = getBounds(type);
+    int[] nameBounds = getBounds(type);
+    RutaBlock block = new RutaBlock(type.getText(), type.getText(), nameBounds[0], nameBounds[1],
+            bounds[0], bounds[1]);
+    return block;
+  }
+
+  public void finalizeBlock(RutaBlock block, Token rc, RutaRule rule, List<Statement> body) {
     // taking care of null statements - errors should have been recognized
     // in parser
     filterNullObjects(body);