Little Jeans
Little Jeans

Reputation: 296

ANTLR, heterogeneous AST problem

I examine heterogeneous trees in ANTLR (using ANTLRWorks 1.4.2).

Here is the example of what I have already done in ANTLR.

grammar test;

options {
    language = java;
    output = AST;
}

tokens {
    PROGRAM;
    VAR;
}

@members {
    class Program extends CommonTree {
        public Program(int ttype) {
            token = new CommonToken(ttype, "<start>");
        }
    }
}

start
    :    program var function
        // Works fine:
        //->    ^(PROGRAM program var function)

        // Does not work (described below):
        ->    ^(PROGRAM<Program> program var function)
    ;

program
    :    'program'! ID ';'!
    ;

var
    :    TYPE^ ID ';'!
    ;

function
    :    ID '('! ')'! ';'!
    ;

TYPE
    :    'int'
    |    'string'
    ;

ID
    :    ('a'..'z' | 'A'..'Z')+
    ;

WHITESPACE
    :    (' ' | '\t' '\n'| '\r' | '\f')+ {$channel = HIDDEN;}
    ;

Sample input:

program foobar;
int foo;
bar();

When I use rewrite rule ^(PROGRAM<Program> program var function), ANTLR stumbles over and I get AST like this:

AntLR

Whereas when I use this rewrite rule ^(PROGRAM program var function) it works:

enter image description here

  1. Could anyone explain where am I wrong, please? Frankly, I do not really get the idea of heterogeneous trees and how do I use <…> syntax in ANTLR.

  2. What do r0 and r1 mean (first picture)?

Upvotes: 1

Views: 952

Answers (1)

Bart Kiers
Bart Kiers

Reputation: 170148

I have no idea what these r0 and r1 mean: I don't use ANTLRWorks for debugging, so can't comment on that.

Also, language = java; causes ANTLR 3.2 to produce the error:

error(10): internal error: no such group file java.stg

error(20): cannot find code generation templates java.stg
error(10): internal error: no such group file java.stg

error(20): cannot find code generation templates java.stg

ANTLR 3.2 expects it to be language = Java; (capital "J"). But, by default the target is Java, so, mind as well remove the language = ... entirely.

Now, as to you problem: I cannot reproduce it. As I mentioned, I tested it with ANTLR 3.2, and removed the language = java; part from your grammar, after which everything went as (I) expected.

Enabling the rewrite rule -> ^(PROGRAM<Program> program var function) produces the following ATS:

enter image description here

and when enabling the rewrite rule -> ^(PROGRAM program var function) instead, the following AST is created:

enter image description here

I tested both rewrite rules this with the following class:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("program foobar; int foo; bar();");
        testLexer lexer = new testLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        testParser parser = new testParser(tokens);
        testParser.start_return returnValue = parser.start();
        CommonTree tree = (CommonTree)returnValue.getTree();
        DOTTreeGenerator gen = new DOTTreeGenerator();
        StringTemplate st = gen.toDOT(tree);
        System.out.println(st);
    }
}

And the images are produced using graph.gafol.net (and the output of the Main class, of course).

Upvotes: 3

Related Questions