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 2009/01/24 01:13:32 UTC

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

Author: mriou
Date: Sat Jan 24 00:13:32 2009
New Revision: 737268

URL: http://svn.apache.org/viewvc?rev=737268&view=rev
Log:
Support for E4X embedded expressions.

Added:
    ode/sandbox/simpel/lib/e4x-grammar-0.2.jar
    ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/E4XExprParserHelper.java
Modified:
    ode/sandbox/simpel/Rakefile
    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/main/java/org/apache/ode/simpel/util/ErrorMessageBuilder.java
    ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java

Modified: ode/sandbox/simpel/Rakefile
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/Rakefile?rev=737268&r1=737267&r2=737268&view=diff
==============================================================================
--- ode/sandbox/simpel/Rakefile (original)
+++ ode/sandbox/simpel/Rakefile Sat Jan 24 00:13:32 2009
@@ -90,7 +90,7 @@
   compile.enhance([task('tweak_antlr')])
   compile.with HSQLDB, JAVAX.resource, JAVAX.transaction, COMMONS.lang, COMMONS.logging,
     ODE, LOG4J, WSDL4J, ASM, JERSEY, JAVAX.rest, JETTY, GERONIMO.transaction, XERCES,
-    file(_("lib/e4x-grammar-0.1.jar")), ANTLR, file(_("lib/rhino-1.7R2pre-patched.jar"))
+    file(_("lib/e4x-grammar-0.2.jar")), ANTLR, file(_("lib/rhino-1.7R2pre-patched.jar"))
   test.using :fork => :each
   package :jar
 end

Added: ode/sandbox/simpel/lib/e4x-grammar-0.2.jar
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/lib/e4x-grammar-0.2.jar?rev=737268&view=auto
==============================================================================
Files ode/sandbox/simpel/lib/e4x-grammar-0.2.jar (added) and ode/sandbox/simpel/lib/e4x-grammar-0.2.jar Sat Jan 24 00:13:32 2009 differ

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=737268&r1=737267&r2=737268&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 Sat Jan 24 00:13:32 2009
@@ -55,7 +55,8 @@
     private CharStream cs;
     private ErrorListener el;
     private Stack paraphrases = new Stack();
-    
+    private E4XHelper e4xHelper;
+
     public void setInput(SimPELLexer lexer, CharStream cs) {
         this.lexer = lexer;
         this.cs = cs;
@@ -63,10 +64,13 @@
     public void setErrorListener(ErrorListener el) {
     	this.el = el;
     }
+    public void setE4XHelper(E4XHelper h) {
+        e4xHelper = h;
+    }
 
     /** Handle 'island grammar' for embeded XML-literal elements. */
     private LinkedListTree parseXMLLiteral() throws RecognitionException {
-        return E4XHelper.parseXMLLiteral(lexer, cs, (LinkedListTokenStream)input);
+        return e4xHelper.parseXMLLiteral(lexer, cs, (LinkedListTokenStream)input);
     }
     /** Handle 'island grammar' for embeded JavaScript-literal elements. */
     private LinkedListTree parseJSLiteral() throws RecognitionException {
@@ -78,7 +82,7 @@
     }
     
     public String getErrorMessage(RecognitionException e, String[] tokenNames) {
-//    	  List stack = getRuleInvocationStack(e, this.getClass().getName());
+        if (paraphrases.size() == 0) return super.getErrorMessage(e, tokenNames);
         String msg = ErrorMessageBuilder.msg(e, tokenNames, (String) paraphrases.peek());
         if (msg == null) msg = super.getErrorMessage(e, tokenNames);
         return msg;
@@ -87,6 +91,18 @@
     public String getTokenErrorDisplay(Token t) {
         return t.toString();
     }
+
+    /**
+     * Returns the input left unconsumed after the last parse operation.
+     * Because of lookahead in the parser, there is no guarantee that the
+     * lexer has not consumed input ahead of the current parse-point for
+     * any abritrary rule. This method is only intended to grab the
+     * remaining input after recognising 'xmlPrimary'.
+     */
+    public String getInputTail() {
+        return cs.substring(cs.index()-1, cs.size()-1);
+    }
+
 }
 
 // MAIN BPEL SYNTAX
@@ -318,10 +334,12 @@
 xml_literal
 @init { LinkedListTree xml = null; }
 	:	// We have to have the LT in the outer grammar for lookahead
-		// in AS3Parser to be able to predict that the xmlLiteral rule
-		// should be used.
+		// to be able to predict that the xmlLiteral rule should be used.
 		'<' { xml=parseXMLLiteral(); } -> { xml };
 
+e4x_expr
+        : L_CURLY! s_expr '}'!;
+
 js_block
 @init { LinkedListTree js = null; }
 	:	'{' { js=parseJSLiteral(); } -> { js };
@@ -338,6 +356,8 @@
 ESCAPE_SEQ
 	:	'\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\');
 
+L_CURLY: '{';
+
 SL_COMMENTS
 	:	'//' .* CR { $channel = HIDDEN; };
 CR	:	('\r' | '\n' )+ { $channel = HIDDEN; };

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=737268&r1=737267&r2=737268&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 Sat Jan 24 00:13:32 2009
@@ -352,7 +352,7 @@
 xmlAttribute
 	:	^(XML_ATTRIBUTE XML_NAME XML_ATTRIBUTE_VALUE) { System.out.println("ATTR " + $XML_NAME.text); };
 xmlElementContent
-	:	xmlMarkup | xmlText | xmlElement;
+	:	xmlMarkup | xmlText | xmlElement | s_expr;
 xmlText :	XML_TEXT | XML_NAME | XML_WS;
 xmlMarkup
 	:	XML_COMMENT | XML_CDATA | XML_PI;

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=737268&r1=737267&r2=737268&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 Sat Jan 24 00:13:32 2009
@@ -11,6 +11,7 @@
 import org.apache.ode.simpel.antlr.SimPELParser;
 import org.apache.ode.simpel.antlr.SimPELWalker;
 import org.apache.ode.simpel.util.DefaultErrorListener;
+import org.apache.ode.simpel.util.E4XExprParserHelper;
 import org.apache.ode.simpel.omodel.OBuilder;
 import org.apache.ode.Descriptor;
 import org.mozilla.javascript.Context;
@@ -18,6 +19,7 @@
 import org.mozilla.javascript.serialize.ScriptableOutputStream;
 import org.mozilla.javascript.serialize.ScriptableInputStream;
 import uk.co.badgersinfoil.e4x.antlr.*;
+import uk.co.badgersinfoil.e4x.E4XHelper;
 
 import java.io.*;
 import java.lang.reflect.Field;
@@ -95,6 +97,11 @@
         parser.setTreeAdaptor(new LinkedListTreeAdaptor());
         parser.setInput(lexer, charstream);
         parser.setErrorListener(errListener);
+        E4XHelper e4xHelper = new E4XHelper();
+        E4XExprParserHelper e4xParserHelper = new E4XExprParserHelper();
+        e4xParserHelper.setErrorListener(errListener);
+        e4xHelper.setExpressionParser(e4xParserHelper);
+        parser.setE4XHelper(e4xHelper);
 
         SimPELParser.program_return result = null;
         try {

Added: ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/E4XExprParserHelper.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/E4XExprParserHelper.java?rev=737268&view=auto
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/E4XExprParserHelper.java (added)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/E4XExprParserHelper.java Sat Jan 24 00:13:32 2009
@@ -0,0 +1,73 @@
+package org.apache.ode.simpel.util;
+
+import uk.co.badgersinfoil.e4x.E4XExpressionParser;
+import uk.co.badgersinfoil.e4x.antlr.*;
+import org.antlr.runtime.TokenSource;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.ANTLRReaderStream;
+import org.apache.ode.simpel.antlr.SimPELParser;
+import org.apache.ode.simpel.antlr.SimPELLexer;
+import org.apache.ode.simpel.ErrorListener;
+
+import java.io.StringReader;
+import java.io.IOException;
+import java.io.Reader;
+
+public class E4XExprParserHelper implements E4XExpressionParser {
+
+    private ErrorListener el;
+
+    public LinkedListTree parseSubExpression(TokenSource lexer, CharStream cs,
+                 LinkedListTokenStream stream) throws RecognitionException {
+        String tail = cs.substring(cs.index(), cs.size()-1);
+        int initialTailLength = tail.length();
+        SimPELParser parser;
+        try {
+            parser = xmlextParserOn(new StringReader(tail), stream);
+        } catch (IOException e) {
+            // TODO: better exception type?
+            throw new RuntimeException(e);
+        }
+        LinkedListTree ast = (LinkedListTree) parser.e4x_expr().getTree();
+        tail = parser.getInputTail();
+        // skip over the XML in the original, underlying CharStream
+        cs.seek(cs.index() + (initialTailLength - tail.length()));
+        LinkedListTokenSource source = (LinkedListTokenSource)stream.getTokenSource();
+        stream.setTokenSource(source);  // cause any remembered E4X state to be dropped
+        stream.scrub(1); // erase the subsequent token that the E4X parser got from this stream
+        source.setDelegate(lexer);
+        return ast;
+    }
+
+    private SimPELParser xmlextParserOn(Reader in, LinkedListTokenStream stream) throws IOException {
+        ANTLRReaderStream cs = new ANTLRReaderStream(in);
+        SimPELLexer lexer = new SimPELLexer(cs);
+        LinkedListTokenSource source = (LinkedListTokenSource)stream.getTokenSource();
+        source.setDelegate(lexer);
+
+        // The main grammar will see the initial '<' as an LT (less-than)
+        // token, and lookahead in the AS3Parser will have already
+        // grabbed references to that token in order to make it the
+        // startToken for various AST subtrees, so we can't just delete
+        // it.  We therefore find the LT token and change its type to
+        // match the E4X vocabulary, and then rewind the token stream
+        // so that this will be the first token that the E4XParser will
+        // see.
+        LinkedListToken startMarker = (LinkedListToken)stream.LT(-1);
+        startMarker.setType(SimPELParser.L_CURLY);
+        stream.seek(stream.index()-1);
+
+        SimPELParser parser = new SimPELParser(stream);
+        parser.setTreeAdaptor(new LinkedListTreeAdaptor());
+        parser.setInput(lexer, cs);
+        parser.setErrorListener(el);
+
+        return parser;
+    }
+
+    public void setErrorListener(ErrorListener el) {
+        this.el = el;
+    }
+
+}

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/ErrorMessageBuilder.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/ErrorMessageBuilder.java?rev=737268&r1=737267&r2=737268&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/ErrorMessageBuilder.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/util/ErrorMessageBuilder.java Sat Jan 24 00:13:32 2009
@@ -15,12 +15,12 @@
         String msg = null;
         if (e instanceof NoViableAltException) {
             if (tokenNames == null) msg = "Invalid character";
-            else msg = "Syntax error, unexpected token " + tokenNames[e.token.getType()];
+            else msg = "Syntax error, unexpected token " + e.token.getText();
         } else if (e instanceof MismatchedTokenException) {
             MismatchedTokenException mte = (MismatchedTokenException) e;
-            msg = "Syntax error, unexpected token " + tokenNames[e.token.getType()] + ", expecting " + tokenNames[mte.expecting];
+            msg = "Syntax error, unexpected token " + e.token.getText() + ", expecting " + tokenNames[mte.expecting];
         } else if (e instanceof EarlyExitException) {
-            msg = "At least one element is required at " + tokenNames[e.token.getType()];
+            msg = "At least one element is required at " + e.token.getText();
         }
         if (msg != null && paraphrase != null) msg = msg + " " + paraphrase;
         return msg;

Modified: ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java?rev=737268&r1=737267&r2=737268&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java (original)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java Sat Jan 24 00:13:32 2009
@@ -30,10 +30,11 @@
     }
 
     private static final String HELLO_WORLD =
-            "process HelloWorld {\n" +
-            "   receive(self) { |name|\n" +
-            "       helloName = \"Hello \" + name;\n" +
-            "       reply(helloName);\n" +
+            "process HelloWorld { \n" +
+            "   receive(self) { |name| \n" +
+            "       helloTmp = \"Hello \" + name; \n" +
+            "       helloXml = <hello>{helloTmp}</hello>; \n" +
+            "       reply(helloXml); \n" +
             "   }\n" +
             "}";