You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2007/11/21 22:42:54 UTC

svn commit: r597216 - in /ode/sandbox/simpel: lib/ src/main/antlr/org/apache/ode/simpel/antlr/ src/main/java/org/apache/ode/simpel/ src/test/java/org/apache/ode/simpel/

Author: mriou
Date: Wed Nov 21 13:42:54 2007
New Revision: 597216

URL: http://svn.apache.org/viewvc?rev=597216&view=rev
Log:
Finally found a work around to handle functions containing arbitrary code.

Removed:
    ode/sandbox/simpel/lib/antlr-20071115.jar
Modified:
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g
    ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/SimPELCompiler.java
    ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELTest.java

Modified: ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g?rev=597216&r1=597215&r2=597216&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g (original)
+++ ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g Wed Nov 21 13:42:54 2007
@@ -8,7 +8,7 @@
 tokens {
     PROCESS; PICK; SEQUENCE; FLOW; IF; ELSEIF; ELSE; WHILE; UNTIL; FOREACH; FORALL; INVOKE;
     RECEIVE; REPLY; ASSIGN; THROW; WAIT; EXIT; TIMEOUT; 
-    EXPR; EXT_EXPR; XML_LITERAL; FUNCTION;
+    EXPR; EXT_EXPR; XML_LITERAL;
 }
 @parser::header {
 package org.apache.ode.simpel.antlr;
@@ -42,7 +42,7 @@
 
 program	:	declaration+;
 declaration
-	:	function | process;
+	:	funct | process;
 
 // Process
 process	:	'process' ID block -> ^(PROCESS ID block);
@@ -91,7 +91,7 @@
 exit	:	'exit' -> ^(EXIT);
 
 // TODO This will not work for any function whose code contains braces
-function:	'function' f=ID '(' ID? (',' ID)* ')' '{' (options {greedy=false;} : .)* '}';
+funct	:	'function'^ f=ID '(' ID? (','! ID)* ')' '{'! (options {greedy=false;} : .)* '}'!;
 
 // Expressions
 expr	:	s_expr | EXT_EXPR;

Modified: ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g?rev=597216&r1=597215&r2=597216&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g (original)
+++ ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g Wed Nov 21 13:42:54 2007
@@ -60,7 +60,7 @@
 
 exit	:	EXIT;
 
-//function:	^(FUNCTION );
+function:	^(FUNCTION ID);
 
 // XML
 xmlElement

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/SimPELCompiler.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/SimPELCompiler.java?rev=597216&r1=597215&r2=597216&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/SimPELCompiler.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/SimPELCompiler.java Wed Nov 21 13:42:54 2007
@@ -1,7 +1,6 @@
 package org.apache.ode.simpel;
 
 import org.antlr.runtime.ANTLRReaderStream;
-import org.antlr.runtime.Token;
 import org.antlr.runtime.tree.CommonTreeNodeStream;
 import org.antlr.runtime.tree.Tree;
 import org.antlr.runtime.tree.TreeParser;
@@ -12,6 +11,7 @@
 
 import java.io.StringReader;
 import java.lang.reflect.Field;
+import java.util.ArrayList;
 import java.util.HashMap;
 
 public class SimPELCompiler {
@@ -31,7 +31,11 @@
 
         if (t == null) {
             System.out.println("There were parser errors.");
+            throw new RuntimeException("Parse errors!");
         } else {
+            //  Handle functions separately
+            handleFunctions(t);
+
             // Pass the tree to the walker for compilation
             CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
             SimPELWalker walker = new SimPELWalker(nodes);
@@ -45,13 +49,42 @@
         }
     }
 
+    private static void handleFunctions(Tree t) {
+        ArrayList<Integer> toRemove = new ArrayList<Integer>();
+        for(int m = 0; m < t.getChildCount(); m++) {
+            if ("function".equals(t.getChild(m).getText())) {
+                Tree funcTree = t.getChild(m);
+
+                // Extracting function structure
+                ArrayList<String> params = new ArrayList<String>();
+                StringBuffer body = new StringBuffer();
+                boolean signature = true;
+                for (int p = 2; p < funcTree.getChildCount(); p++) {
+                    String txt = funcTree.getChild(p).getText();
+                    if (")".equals(txt)) signature = false;
+                    if (signature) params.add(txt);
+                    else body.append(txt);
+                }
+                System.out.println("Found function: " + funcTree.getChild(0) + "(" + params + ") {"
+                        + body.toString() + "}");
+
+                toRemove.add(m);
+            }
+        }
+        // Voluntarily not using an iterator, we want to be index based
+        for(int m = 0; m < toRemove.size(); m++) {
+            t.deleteChild(toRemove.get(m));
+            for(int n = 0; n < toRemove.size(); n++) {
+                if (toRemove.get(n) > toRemove.get(m)) toRemove.set(n, toRemove.get(n) - 1);
+            }
+        }
+    }
+
     private static void rewriteTokens(HashMap<Integer, Integer> tokenMapping, String[] tokenNames,
                                       LinkedListTree t, TreeParser targetLexer, boolean xmlNode) {
-//        System.out.println("### " + t.token);
         if (t.token != null && tokenMapping.get(t.token.getType()) != null && (in(tokenNames, t.token.getText()) || xmlNode)) {
             t.token.setType(tokenMapping.get(t.token.getType()));
             xmlNode = true;
-            System.out.print(t.token.getText() + "(" + t.token.getType() + ") ");
         }
         for(int m = 0; m < t.getChildCount(); m++) {
             rewriteTokens(tokenMapping, tokenNames, (LinkedListTree) t.getChild(m), targetLexer, xmlNode);

Modified: ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELTest.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELTest.java?rev=597216&r1=597215&r2=597216&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELTest.java (original)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELTest.java Wed Nov 21 13:42:54 2007
@@ -16,21 +16,24 @@
 
 public class SimPELTest extends TestCase {
     private static String PROCESS =
-//        "function myFunc(p1, p2) {" +
-//        "   return (p1 + p2 < 10);" +
-//        "}" +
-        "process ExternalCounter {\n" +
-        "  receive(my_pl, start_op) (msg_in) {\n" +
-        "    resp = <root><count start=\"0\">0</count></root>\n" +
-        "    while(resp < 10) {\n" +
-        "      partner_pl.partner_start_op(msg_in)\n" +
-        "      resp = receive(partner_pl, partner_reply_op)\n" +
-        "    }\n" +
-        "    reply resp\n" +
-        "  }\n" +
-        "}";
+        "function myFunc(p1, p2) {                              \n" +
+        "   return (p1 + p2 < 10);                              \n" +
+        "}                                                      \n" +
+        "process ExternalCounter {                              \n" +
+        "  receive(my_pl, start_op) (msg_in) {                  \n" +
+        "    resp = <root><count start=\"0\">0</count></root>   \n" +
+        "    while(resp < 10) {                                 \n" +
+        "      partner_pl.partner_start_op(msg_in)              \n" +
+        "      resp = receive(partner_pl, partner_reply_op)     \n" +
+        "    }                                                  \n" +
+        "    reply resp                                         \n" +
+        "  }                                                    \n" +
+        "}                                                        ";
 
     public static void testSimpleProcess() throws Exception {
+        System.out.println("Parsing process:");
+        System.out.println(PROCESS);
+        // Just checking that we can parse for now.
         SimPELCompiler.parseProcess(PROCESS);
     }