package fr.lteconsulting.hexa.demo.client.persistence; import java.util.List; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CharStream; import org.antlr.runtime.CommonToken; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.tree.CommonTree; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.TextBox; import fr.lteconsulting.hexa.client.ui.UiBuilder; import fr.lteconsulting.hexa.persistence.client.hqlLexer; import fr.lteconsulting.hexa.persistence.client.hqlParser; import fr.lteconsulting.hexa.persistence.client.hqlParser.statement_return; public class PersistenceDemo implements EntryPoint { HTML result = new HTML(); @Override public void onModuleLoad() { EMTest emtest = new EMTest(); emtest.run(); if( RootPanel.get( "place" ) == null ) { DivElement place = Document.get().createDivElement(); place.setId( "place" ); Document.get().getBody().appendChild( place ); } final TextBox tb = new TextBox(); tb.setWidth( "500px" ); tb.setText( "sElect a.text from Activity a left join Category c" ); Button parseButton = new Button( "Parse !" ); parseButton.addClickHandler( new ClickHandler() { @Override public void onClick( ClickEvent event ) { parse( tb.getText() ); } } ); UiBuilder.addIn( RootPanel.get("place"), new Label( "Please enter an HQL expression to be parsed :" ), tb, parseButton, result ); } void parse( String expression ) { hqlLexer lexer = new hqlLexer( new ANTLRNoCaseStringStream( expression ) ); CommonTokenStream tokenStream = new CommonTokenStream( lexer ); hqlParser parser = new hqlParser( tokenStream ); try { statement_return statement = parser.statement(); if( statement == null ) { result.setHTML( "<span style='color:red;'>Unable to parse. Syntax error ?</span>" ); return; } StringBuilder sb = new StringBuilder(); sb.append( "<span style='color:green;'>Successfully parsed</span><br/>Here is a text representation of the <b>Abstract Syntax Tree</b><br/>" ); sb.append( statement.getTree().toStringTree() + "<br/><br/>" ); sb.append( "<div style='border:1px solid grey;'>" + visitTreeHTML( statement.getTree(), parser.getTokenNames(), 0 ) + "</div>" ); result.setHTML( sb.toString() ); } catch( RecognitionException e ) { result.setHTML( "<span style='color:red;'>Unable to parse. RecognitionException : " + e.getMessage() + "</span>" ); } } String visitTreeHTML( CommonTree tree, String[] tokenNames, int indent ) { if( tree == null ) return "(null-tree)"; String tokenText = tree.getToken()!=null ? tree.getToken().getText() : "???"; String tokenType = tokenNames[tree.getType()]; String res = makeIndent( indent ); if( tokenText.equalsIgnoreCase( tokenType ) ) res += tokenType; else res += tokenText + " (" + tokenNames[tree.getType()] + ")"; res += "<br/>"; List<?> children = tree.getChildren(); if( children == null ) return res; indent++; for( Object child : children ) { if( child instanceof CommonTree ) { res += visitTreeHTML( (CommonTree ) child, tokenNames, indent ); } else { res += "@#&!!!<br/>"; } } indent--; return res; } private String makeIndent( int indent ) { StringBuilder sb = new StringBuilder(); for( int i=0; i<indent; i++ ) sb.append( "     " ); return sb.toString(); } String visitTree( CommonTree tree, String[] tokenNames ) { if( tree == null ) return "(null-tree)"; String tokenText = tree.getToken()!=null ? tree.getToken().getText() : "???"; String tokenType = tokenNames[tree.getType()]; String res; if( tokenText.equalsIgnoreCase( tokenType ) ) res = tokenText; else res = tokenText + " (" + tokenNames[tree.getType()] + ")"; if( tree.getToken() == null ) { return tree.toStringTree(); } List<?> children = tree.getChildren(); if( children == null ) return res; boolean firstChild = true; res += " <- { "; for( Object child : children ) { if( ! firstChild ) res += ", "; firstChild = false; if( child instanceof CommonTree ) { res += visitTree( (CommonTree ) child, tokenNames ); } else if( child instanceof CommonToken ) { CommonToken tok = (CommonToken) child; res += " [" + tok.getText() + ";" + tokenNames[tok.getType()] + "] "; } } res += " } "; return res; } } class ANTLRNoCaseStringStream extends ANTLRStringStream { public ANTLRNoCaseStringStream(String stream) { super(stream); } @Override public int LA(int i) { if ( i==0 ) { return 0; // undefined } if ( i<0 ) { i++; // e.g., translate LA(-1) to use offset 0 } if ( (p+i-1) >= n ) { return CharStream.EOF; } return Character.toLowerCase(data[p+i-1]); } }