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);
}