Showing posts with label ANTLR. Show all posts
Showing posts with label ANTLR. Show all posts

Sunday, February 26, 2012

Start ANTLR project with Maven

http://www.antlr.org/wiki/display/ANTLR3/Building+ANTLR+Projects+with+Maven

http://www.eclipse.org/m2e/
Download m2e
http://www.eclipse.org/m2e/download/





dave@dave antlr-maven]$ mvn archetype:generate -B -DarchetypeGroupId=org.antlr
-DarchetypeArtifactId=antlr3-maven-archetype
-DarchetypeVersion=3.3-1
-DgroupId=dave.antlr
-DartifactId=java-tree-walker
-Dversion=1.0
-Dpackage=dave.antlr
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] Archetype repository missing. Using the one from [org.antlr:antlr3-maven-archetype:3.4] found in catalog remote
Downloading: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.jar
Downloaded: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.jar (11 KB at 34.4 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.pom
Downloaded: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.pom (3 KB at 6.0 KB/sec)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: antlr3-maven-archetype:3.3-1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: davedave@dave antlr-maven]$ mvn archetype:generate -B -DarchetypeGroupId=org.antlr -DarchetypeArtifactId=antlr3-maven-archetype -DarchetypeVersion=3.3-1 -DgroupId=dave.antlr -DartifactId=java-tree-walker -Dversion=1.0 -Dpackage=dave.antlr
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] Archetype repository missing. Using the one from [org.antlr:antlr3-maven-archetype:3.4] found in catalog remote
Downloading: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.jar
Downloaded: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.jar (11 KB at 34.4 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.pom
Downloaded: http://repo1.maven.org/maven2/org/antlr/antlr3-maven-archetype/3.3-1/antlr3-maven-archetype-3.3-1.pom (3 KB at 6.0 KB/sec)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: antlr3-maven-archetype:3.3-1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: dave.antlr
[INFO] Parameter: artifactId, Value: java-tree-walker
[INFO] Parameter: version, Value: 1.0
[INFO] Parameter: package, Value: dave.antlr
[INFO] Parameter: packageInPathFormat, Value: dave/antlr
[INFO] Parameter: package, Value: dave.antlr
[INFO] Parameter: version, Value: 1.0
[INFO] Parameter: groupId, Value: dave.antlr
[INFO] Parameter: artifactId, Value: java-tree-walker
[INFO] project created from Archetype in dir: /usr/app/project/antlr-maven/java-tree-walker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.303s
[INFO] Finished at: Sun Feb 26 10:40:25 CET 2012
[INFO] Final Memory: 7M/17M
[INFO] ------------------------------------------------------------------------



[dave@dave java-tree-walker]$ cat >dave.dmo
Keyser Soze ;
2 + 3;



java -jar target/java-tree-walker-1.0-jar-with-dependencies.jar dave.dmo

java -jar target/java-tree-walker-1.0-jar-with-dependencies.jar -dot dave.dmo




Tuesday, February 8, 2011

ANTLR - SWIFT fields parser

grammar SwiftBlock;

@header {
package generated;
import java.util.Map;
import java.util.HashMap;
}

@lexer::header {
package generated;
}

@members {
HashMap message = new HashMap();

public Map<String,String> getMessage(){
return message;
}

}
message : block+;

block : '{' '1' ':' expr {System.out.println("expr1=" + $expr.text);} '}' |
'{' '2' ':' expr {System.out.println("expr2=" + $expr.text);} '}' |
'{' '3' ':' expr3* '}' |
'{' '4' ':' expr4+ '}' |
'{' '5' ':' expr5+ '}' ;

expr3 : '{' key ':' expr '}' {System.out.println("expr3=" + $expr3.text);message.put($key.text,$expr.text);} ;

expr4 : ('\n'|'\r')+ (':' key ':' expr {System.out.println("expr4=" + $expr.text); message.put($key.text,$expr.text);} | '-')+;

expr5 : ('\n'|'\r')+ '{' key ':' expr '}' {System.out.println("expr5=" + $expr.text);message.put($key.text,$expr.text);} ;

key : FIELDVALUE* {System.out.println("key=" + $key.text);} ;
expr : FIELDVALUE* {System.out.println("expr=" + $expr.text);} ;


/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
FIELDVALUE : (~('-'|':'|'}'|'{'))+;



Compile grammar
java -cp /app/antlr-3.3/lib/antlr-3.3-complete.jar org.antlr.Tool -o generated SwiftBlock.g 




Test program

import generated.SwiftBlockLexer;
import generated.SwiftBlockParser;

import java.io.FileInputStream;
import java.util.Map;

import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.CommonTokenStream;

public class AntlrSwiftBlock {
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("/home/dave/workspace/wls1033/testAntlr/src/swift.txt");
ANTLRInputStream input = new ANTLRInputStream(fileInputStream);
SwiftBlockLexer lexer = new SwiftBlockLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
SwiftBlockParser parser = new SwiftBlockParser(tokens);
parser.message();

System.out.println("Message:");

for(Map.Entry<String,String> entry : parser.getMessage().entrySet()){
System.out.println(entry);
}
}
}


SWIFT message
{1:F01AAAABB99BSMK3513951576}{2:O9400934081223BBBBAA33XXXX03592332770812230834N}{3:{113:xxxx}{108:abcdefgh12345678}}{4:
:20:0112230000000890
:25:SAKG800030155USD
:28C:255/1
:60F:C011223USD175768,92
:61:0112201223CD110,92NDIVNONREF//08 IL053309
/GB/2542049/SHS/312,
:62F:C011021USD175879,84
-}{5:
{CHK:0F4E5614DD28}
{MAC:0F4E5614DD28}}


Result output
Message:
20=0112230000000890

62F=C011021USD175879,84

113=xxxx
CHK=0F4E5614DD28
108=abcdefgh12345678
25=SAKG800030155USD

MAC=0F4E5614DD28
60F=C011223USD175768,92

61=0112201223CD110,92NDIVNONREF//08 IL053309
/GB/2542049/SHS/312,

28C=255/1


Tuesday, February 1, 2011

ANTLR - insert current indent - rewrite multiple lines

See ANTLR4 for other solution using Listener
https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Parse+Tree+Listeners
http://media.pragprog.com/titles/tpantlr2/listener.pdf

Get current indent from token stream using direct Java access to token stream - get all token on HIDDEN channel on current line
How do I access hidden tokens from parser?
http://www.antlr.org/wiki/pages/viewpage.action?pageId=557063



        int startIndex = input.getTreeAdaptor().getTokenStartIndex(retval.start);
        int stopIndex = input.getTreeAdaptor().getTokenStopIndex(retval.start);
        int line = ((Token) input.getTokenStream().get(startIndex)).getLine();
        System.out.println("\nLINE: line" + line + " retval.start" + startIndex + " stop=" + stopIndex);  

        int currentIndex = stopIndex;
        Token token;
        // print all tokens on line
        while (currentIndex >= startIndex &&
                (token = (Token) input.getTokenStream().get(currentIndex)).getLine() == line
        ) {
            System.out.println("currentIndex=" + currentIndex +
                    " line=" + token.getLine() +
                    " token" + token);
            currentIndex--;
        }

        // set current to indent whitespace
        currentIndex = startIndex - 1;
        System.out.println("START: currentIndex=" + currentIndex);

        StringBuffer indent = new StringBuffer();
        while (currentIndex > -1 &&  (token = (Token) input.getTokenStream().get(currentIndex)).getChannel() == Parser.HIDDEN ) {
            System.out.println("INDENT: currentIndex=" + currentIndex + "channel=" +
                    token.getChannel() + " text" + token.getText()
                    + " type=" + token.getType());
            if(token.getText().matches("[\t ]+")){
                indent.append(token.getText());
            }
            currentIndex--;
        }
        if(indent.length() > 0){
            ((primaryExpression_scope) primaryExpression_stack.peek()).indent = indent.toString();

        } else {
            ((primaryExpression_scope) primaryExpression_stack.peek()).indent = "";
        }



Pass current indent to StringTemplate using scope variable
primaryExpression
scope {
  boolean isMethodCall;
  String indent;
}


Rewrite rule
|   ^(METHOD_CALL  primaryExpression {$primaryExpression::isMethodCall=true;} genericTypeArgumentList? arguments)
     
       {
         // Java code inserted here
       }
        -> 
      methodCall(indent={$primaryExpression::indent}, methodCallText={$text})


StringTemplate
group Java;

methodCall(indent,methodCallText) ::= <<
<methodCallText>
<indent>log("Called <methodCallText>")
>>


Log output - getting indent and rewritten HelloWorld program
LINE: line15 retval.start69 stop=72
currentIndex=72 line=15 token[@72,217:217=')',<43>,15:9]
currentIndex=71 line=15 token[@71,216:216='x',<164>,15:8]
currentIndex=70 line=15 token[@70,215:215='(',<29>,15:7]
currentIndex=69 line=15 token[@69,210:214='print',<164>,15:2]
START: currentIndex=68
INDENT: currentIndex=68channel=99 text     type=180
INDENT: currentIndex=67channel=99 text     type=180
INDENT: currentIndex=66channel=99 text
 type=180
INDENT: currentIndex=65channel=99 text  type=180

LINE: line17 retval.start78 stop=85
currentIndex=85 line=17 token[@85,256:256=')',<43>,17:35]
currentIndex=84 line=17 token[@84,242:255='"Hello,world!"',<170>,17:21]
currentIndex=83 line=17 token[@83,241:241='(',<29>,17:20]
currentIndex=82 line=17 token[@82,234:240='println',<164>,17:13]
currentIndex=81 line=17 token[@81,233:233='.',<15>,17:12]
currentIndex=80 line=17 token[@80,230:232='out',<164>,17:9]
currentIndex=79 line=17 token[@79,229:229='.',<15>,17:8]
currentIndex=78 line=17 token[@78,223:228='System',<164>,17:2]
START: currentIndex=77
INDENT: currentIndex=77channel=99 text     type=180
INDENT: currentIndex=76channel=99 text     type=180
INDENT: currentIndex=75channel=99 text
 type=180
INDENT: currentIndex=74channel=99 text
 type=180

LINE: line22 retval.start112 stop=119
currentIndex=119 line=22 token[@119,323:323=')',<43>,22:22]
currentIndex=118 line=22 token[@118,322:322='x',<164>,22:21]
currentIndex=117 line=22 token[@117,321:321='(',<29>,22:20]
currentIndex=116 line=22 token[@116,314:320='println',<164>,22:13]
currentIndex=115 line=22 token[@115,313:313='.',<15>,22:12]
currentIndex=114 line=22 token[@114,310:312='out',<164>,22:9]
currentIndex=113 line=22 token[@113,309:309='.',<15>,22:8]
currentIndex=112 line=22 token[@112,303:308='System',<164>,22:2]
START: currentIndex=111
INDENT: currentIndex=111channel=99 text     type=180
INDENT: currentIndex=110channel=99 text     type=180
INDENT: currentIndex=109channel=99 text
 type=180

Tokens:

public class HelloWorld {

    static int x;

    /**
     * This is test class for ANTLR Java source code transformation
     * @param args
     */
    public static void main(String args[]) {

        int x;
        int y;
        
        x = 1; 
        print(x)
         log("Called print(x)");

        System.out.println("Hello,world!")
        log("Called System.out.println("Hello,world!")");

    }
    
    private static  void print(int x){
        System.out.println(x)
        log("Called System.out.println(x)");
    }

}

Sunday, January 30, 2011

ANTLR - Java source code rewrite

See ANTLR4 for other solution using Listener
https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Parse+Tree+Listeners
http://media.pragprog.com/titles/tpantlr2/listener.pdf

Using examples from chapter 9 in http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

Java tree grammar used for rewrite example
http://www.antlr.org/grammar/1207932239307/Java1_5Grammars
Dieter Habelitz - A Java 1.5 grammar that builds trees and a tree grammar. Not derived from Java grammar Terence wrote.
original link broken - http://www.antlr3.org/grammar/1207932239307/Java1_5Grammars

Try this on  github
https://github.com/grammarware/slps/tree/master/topics/grammars/java-5/habelitz 

Add template rewrite call into tree grammar JavaTreeParser.g
  |   ^(METHOD_CALL  primaryExpression {$primaryExpression::isMethodCall=true;} genericTypeArgumentList? arguments)
      -> methodCall(methodCallText={$text})


Create template file JavaTreeTemplate.stg
group Java;

methodCall(methodCallText) ::= <<
$methodCallText$;
log("Called $methodCallText$")
>>


import java.io.FileReader;

import generated.JavaLexer;
import generated.JavaParser;
import generated.JavaTreeParser;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.TokenRewriteStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
import org.antlr.stringtemplate.language.DefaultTemplateLexer;


public class JavaTreeWalker {
    
    public static void main(String[] args) throws Exception {
        
        String templateFileName = "src/JavaTreeTemplate.stg";
        StringTemplateGroup templates = new StringTemplateGroup(new FileReader(templateFileName),
                            DefaultTemplateLexer.class);
        
        ANTLRFileStream input = new ANTLRFileStream(args[0]);
        
        JavaLexer lexer = new JavaLexer(input);
        
        TokenRewriteStream tokens = new TokenRewriteStream(lexer);
        
        JavaParser parser = new JavaParser(tokens);
        
        JavaParser.javaSource_return r = parser.javaSource();
        
        CommonTree t = (CommonTree)r.getTree();
        
        System.out.println(t.toStringTree());
        
        CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
        
        nodes.setTokenStream(tokens);
        
        JavaTreeParser walker = new JavaTreeParser(nodes);
        
        walker.setTemplateLib(templates);
        
        System.out.println("\nWalk tree:\n");
        printTree(t,0);
        
        walker.javaSource();
        
        System.out.println(tokens.toString());
        
    }
    
    public static void printTree(CommonTree t, int indent) {
        if ( t != null ) {
            StringBuffer sb = new StringBuffer(indent);
            for ( int i = 0; i < indent; i++ )
                sb = sb.append("   ");
            for ( int i = 0; i < t.getChildCount(); i++ ) {
                System.out.println(sb.toString() + t.getChild(i).toString());
                printTree((CommonTree)t.getChild(i), indent+1);
            }
        }
    }


}


Original HelloWorld Java program
public class HelloWorld {

    static int x;

    /**
     * This is test class for ANTLR Java source code transformation
     * @param args
     */
    public static void main(String args[]) {

        int x;
        int y;
        
        x = 1; 
        print(x);

        System.out.println("Hello,world!");

    }
    
    private static  void print(int x){
        System.out.println(x);
    }

}


Program after rewrite by ANTLR
public class HelloWorld {

    static int x;

    /**
     * This is test class for ANTLR Java source code transformation
     * @param args
     */
    public static void main(String args[]) {

        int x;
        int y;
        
        x = 1; 
        print(x);
log("Called print(x)");

        System.out.println("Hello,world!");
log("Called System.out.println("Hello,world!")");

    }
    
    private static  void print(int x){
        System.out.println(x);
log("Called System.out.println(x)");
    }

}


ANTLR AST
(JAVA_SOURCE ANNOTATION_LIST (class (MODIFIER_LIST public) HelloWorld (CLASS_TOP_LEVEL_SCOPE (VAR_DECLARATION (MODIFIER_LIST static) (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String)) (args (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)))) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR y))) (EXPR (= x 1)) (EXPR (METHOD_CALL print (ARGUMENT_LIST (EXPR x)))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "Hello,world!")))))) (VOID_METHOD_DECL (MODIFIER_LIST private static) print (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE int) x)) (BLOCK_SCOPE (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR x)))))))))

Walk tree:

ANNOTATION_LIST
class
   MODIFIER_LIST
      public
   HelloWorld
   CLASS_TOP_LEVEL_SCOPE
      VAR_DECLARATION
         MODIFIER_LIST
            static
         TYPE
            int
         VAR_DECLARATOR_LIST
            VAR_DECLARATOR
               x
      VOID_METHOD_DECL
         MODIFIER_LIST
            public
            static
         main
         FORMAL_PARAM_LIST
            FORMAL_PARAM_STD_DECL
               LOCAL_MODIFIER_LIST
               TYPE
                  QUALIFIED_TYPE_IDENT
                     String
               args
                  ARRAY_DECLARATOR_LIST
                     ARRAY_DECLARATOR
         BLOCK_SCOPE
            VAR_DECLARATION
               LOCAL_MODIFIER_LIST
               TYPE
                  int
               VAR_DECLARATOR_LIST
                  VAR_DECLARATOR
                     x
            VAR_DECLARATION
               LOCAL_MODIFIER_LIST
               TYPE
                  int
               VAR_DECLARATOR_LIST
                  VAR_DECLARATOR
                     y
            EXPR
               =
                  x
                  1
            EXPR
               METHOD_CALL
                  print
                  ARGUMENT_LIST
                     EXPR
                        x
            EXPR
               METHOD_CALL
                  .
                     .
                        System
                        out
                     println
                  ARGUMENT_LIST
                     EXPR
                        "Hello,world!"
      VOID_METHOD_DECL
         MODIFIER_LIST
            private
            static
         print
         FORMAL_PARAM_LIST
            FORMAL_PARAM_STD_DECL
               LOCAL_MODIFIER_LIST
               TYPE
                  int
               x
         BLOCK_SCOPE
            EXPR
               METHOD_CALL
                  .
                     .
                        System
                        out
                     println
                  ARGUMENT_LIST
                     EXPR
                        x

Saturday, January 29, 2011

ANTLR - Java source tree walker

Java 1.5 grammar for ANTLR v3 that builds trees
 
Dieter Habelitz - A Java 1.5 grammar that builds trees and a tree grammar. Not derived from Java grammar Terence wrote.
original link broken - http://www.antlr3.org/grammar/1207932239307/Java1_5Grammars

Try this on  github
https://github.com/grammarware/slps/tree/master/topics/grammars/java-5/habelitz

Compile grammars
java org.antlr.Tool -o generated Java.g
java org.antlr.Tool -o generated JavaTreeParser.g


Creates following files:
 ls -l generated/
total 1588
-rw-------. 1 dave vesedan  145133 Jan 29 12:20 JavaLexer.java
-rw-------. 1 dave vesedan 1046974 Jan 29 12:20 JavaParser.java
-rw-r--r--. 1 dave vesedan    3687 Jan 29 12:10 Java.tokens
-rw-r--r--. 1 dave vesedan  386412 Jan 29 13:11 JavaTreeParser.java
-rw-r--r--. 1 dave vesedan    3687 Jan 29 13:11 JavaTreeParser.tokens


import generated.JavaLexer;
import generated.JavaParser;
import generated.JavaTreeParser;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;


public class JavaTreeWalker {
    
    public static void main(String[] args) throws Exception {
        
        ANTLRFileStream input = new ANTLRFileStream(args[0]);
        
        JavaLexer lexer = new JavaLexer(input);
        
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        
        JavaParser parser = new JavaParser(tokens);
        
        JavaParser.javaSource_return r = parser.javaSource();
        
        CommonTree t = (CommonTree)r.getTree();
        
        System.out.println(t.toStringTree());
        
        CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
        
        nodes.setTokenStream(tokens);
        
        JavaTreeParser walker = new JavaTreeParser(nodes);
        
        System.out.println("\nWalk tree:\n");
        
        walker.javaSource();
        
        System.out.println(tokens.toString());
        
    }

}


(JAVA_SOURCE ANNOTATION_LIST (import (. generated JavaLexer)) (import (. generated JavaParser)) (import (. generated JavaTreeParser)) (import (. (. (. org antlr) runtime) ANTLRFileStream)) (import (. (. (. org antlr) runtime) CommonTokenStream)) (import (. (. (. (. org antlr) runtime) tree) CommonTree)) (import (. (. (. (. org antlr) runtime) tree) CommonTreeNodeStream)) (class (MODIFIER_LIST public) JavaTreeWalker (CLASS_TOP_LEVEL_SCOPE (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String) (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)) args)) (THROWS_CLAUSE Exception) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT ANTLRFileStream)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR input (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT ANTLRFileStream) (ARGUMENT_LIST (EXPR (ARRAY_ELEMENT_ACCESS args (EXPR 0))))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaLexer)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR lexer (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT JavaLexer) (ARGUMENT_LIST (EXPR input))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT CommonTokenStream)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR tokens (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT CommonTokenStream) (ARGUMENT_LIST (EXPR lexer))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaParser)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR parser (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT JavaParser) (ARGUMENT_LIST (EXPR tokens))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaParser javaSource_return)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR r (EXPR (METHOD_CALL (. parser javaSource) ARGUMENT_LIST))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT CommonTree)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR t (EXPR (CAST_EXPR (TYPE (QUALIFIED_TYPE_IDENT CommonTree)) (METHOD_CALL (. r getTree) ARGUMENT_LIST)))))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR (METHOD_CALL (. t toStringTree) ARGUMENT_LIST))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT CommonTreeNodeStream)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR nodes (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT CommonTreeNodeStream) (ARGUMENT_LIST (EXPR t))))))) (EXPR (METHOD_CALL (. nodes setTokenStream) (ARGUMENT_LIST (EXPR tokens)))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaTreeParser)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR walker (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT JavaTreeParser) (ARGUMENT_LIST (EXPR nodes))))))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "\nWalk tree:\n")))) (EXPR (METHOD_CALL (. walker javaSource) ARGUMENT_LIST)) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR (METHOD_CALL (. tokens toString) ARGUMENT_LIST))))))))))

Walk tree:

importgenerated.JavaLexer;importgenerated.JavaParser;importgenerated.JavaTreeParser;importorg.antlr.runtime.ANTLRFileStream;importorg.antlr.runtime.CommonTokenStream;importorg.antlr.runtime.tree.CommonTree;importorg.antlr.runtime.tree.CommonTreeNodeStream;publicclassJavaTreeWalker{publicstaticvoidmain(String[]args)throwsException{ANTLRFileStreaminput=newANTLRFileStream(args[0]);JavaLexerlexer=newJavaLexer(input);CommonTokenStreamtokens=newCommonTokenStream(lexer);JavaParserparser=newJavaParser(tokens);JavaParser.javaSource_returnr=parser.javaSource();CommonTreet=(CommonTree)r.getTree();System.out.println(t.toStringTree());CommonTreeNodeStreamnodes=newCommonTreeNodeStream(t);nodes.setTokenStream(tokens);JavaTreeParserwalker=newJavaTreeParser(nodes);System.out.println("\nWalk tree:\n");walker.javaSource();System.out.println(tokens.toString());}}


HelloWorld Java program
public class HelloWord {

  static int x;

  public static void main(String args[]){
    
    int y;

    System.out.println("Hello,world!");

  }

}


AST text output

(JAVA_SOURCE ANNOTATION_LIST (class (MODIFIER_LIST public) HelloWorld (CLASS_TOP_LEVEL_SCOPE (VAR_DECLARATION (MODIFIER_LIST static) (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String)) (args (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)))) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR y))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "Hello,world!")))))))))

Walk tree:

publicclassHelloWorld{staticintx;publicstaticvoidmain(Stringargs[]){inty;System.out.println("Hello,world!");}}


With option to keep whitespace set in Java.g
public boolean preserveWhitespacesAndComments = true;


(JAVA_SOURCE ANNOTATION_LIST (class (MODIFIER_LIST public) HelloWorld (CLASS_TOP_LEVEL_SCOPE (VAR_DECLARATION (MODIFIER_LIST static) (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String)) (args (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)))) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR y))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "Hello,world!")))))))))

Walk tree:

public class HelloWorld {

  static int x;

  public static void main(String args[]){
    
    int y;

    System.out.println("Hello,world!");

  }

}




AST generated in ANTLR-Works

Wednesday, July 1, 2009

SWIFT parser using ANTLR

SWIFT definition http://publib.boulder.ibm.com/infocenter/wbihelp/v6rxmx/index.jsp?topic=/com.ibm.wbia_adapters.doc/doc/swift/swift72.htm
ANTLR http://antlr.org/
ANTLRWorks http://antlr.org/works/index.html
ANTLR Cheet sheet http://www.antlr.org/wiki/display/ANTLR3/ANTLR+Cheat+Sheet

grammar SwiftBlock;

message : block+;

block : '{' '1' ':' expr {System.out.println("expr1=" + $expr.text);} '}' |
'{' '2' ':' expr {System.out.println("expr2=" + $expr.text);} '}' |
'{' '3' ':' expr3* '}' |
'{' '4' ':' expr4+ '}' |
'{' '5' ':' expr5+ '}' ;

expr3 : '{' expr ':' expr '}' {System.out.println("expr3=" + $expr3.text);} ;

expr4 : ('\n'|'\r')+ (':' expr ':' expr {System.out.println("expr4=" + $expr4.text);} | '-')+;

expr5 : ('\n'|'\r')+ '{' expr ':' expr '}' {System.out.println("expr5=" + $expr5.text);} ;

expr : FIELDVALUE* {System.out.println("expr=" + $expr.text);} ;


/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/

FIELDVALUE : (~('-'|':'|'}'|'{'|'\n'|'\r'))+;


Grammar Interpreter
Syntax Diagram



Parse tree detail


java -cp .:/home/app/antlr-3.1.3/lib/antlr-3.1.3.jar org.antlr.Tool SwiftBlock.g 


import java.io.FileInputStream;

import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.CommonTokenStream;

public class AntlrSwiftBlock {
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("/home/dave/workspace/antlrSwift/src/swift.txt");
ANTLRInputStream input = new ANTLRInputStream(fileInputStream);
SwiftBlockLexer lexer = new SwiftBlockLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
SwiftBlockParser parser = new SwiftBlockParser(tokens);
parser.message();
}
}


{1:F01AAAABB99BSMK3513951576}{2:O9400934081223BBBBAA33XXXX03592332770812230834N}{3:{113:xxxx}{108:abcdefgh12345678}}{4:
:20:0112230000000890
:25:SAKG800030155USD
:28C:255/1
:60F:C011223USD175768,92
:61:0112201223CD110,92NDIVNONREF//08 IL053309
/GB/2542049/SHS/312,
:62F:C011021USD175879,84
-}{5:
{CHK:0F4E5614DD28}}


expr=F01AAAABB99BSMK3513951576
expr1=F01AAAABB99BSMK3513951576
expr=O9400934081223BBBBAA33XXXX03592332770812230834N
expr2=O9400934081223BBBBAA33XXXX03592332770812230834N
expr=113
expr=xxxx
expr3={113:xxxx}
expr=108
expr=abcdefgh12345678
expr3={108:abcdefgh12345678}
expr=20
expr=0112230000000890
expr4=
:20:0112230000000890
expr=25
expr=SAKG800030155USD
expr4=
:25:SAKG800030155USD
expr=28C
expr=255/1
expr4=
:28C:255/1
expr=60F
expr=C011223USD175768,92
expr4=
:60F:C011223USD175768,92
expr=61
expr=0112201223CD110,92NDIVNONREF//08 IL053309
expr4=
:61:0112201223CD110,92NDIVNONREF//08 IL053309
line 7:0 required (...)+ loop did not match anything at input '/GB/2542049/SHS/312,'
expr=62F
expr=C011021USD175879,84
expr4=
:62F:C011021USD175879,84
expr=CHK
expr=0F4E5614DD28
expr5=
{CHK:0F4E5614DD28}