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" +
"}";