ANTLR, гетерогенная проблема AST - PullRequest
1 голос
/ 12 апреля 2011

Я исследую гетерогенные деревья в ANTLR (используя ANTLRWorks 1.4.2).

Вот пример того, что я уже сделал в 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;}
    ;

Пример ввода:

program foobar;
int foo;
bar();

Когда я использую правило перезаписи ^(PROGRAM<Program> program var function), ANTLR запинается, и я получаю AST следующим образом:

AntLR

Тогда как при использовании этого правила перезаписи ^(PROGRAM program var function) это работает:

enter image description here

  1. Может кто-нибудь объяснить, в чем я не прав, пожалуйста?Честно говоря, я не совсем понимаю идею разнородных деревьев и как я использую синтаксис <…> в ANTLR.

  2. Что означают r0 и r1 (первая картинка)?

1 Ответ

3 голосов
/ 13 апреля 2011

Понятия не имею, что означают эти r0 и r1: я не использую ANTLRWorks для отладки, поэтому не могу комментировать это.

Кроме того, language = java; заставляет ANTLR 3.2 выдавать ошибку:

ошибка (10): внутренняя ошибка: нет такого группового файла java.stg

ошибка (20): не удается найти шаблоны генерации кода java.stg
ошибка (10): внутренняя ошибка: нет такого группового файла java.stg

ошибка (20): не удается найти шаблоны генерации кода java.stg

ANTLR 3.2 ожидает, что он будет language = Java; (заглавная "J"). Но по умолчанию целью является Java, так что не забывайте полностью удалить language = ....

Теперь, что касается вашей проблемы: я не могу ее воспроизвести. Как я уже упоминал, я протестировал его с ANTLR 3.2 и удалил часть language = java; из вашей грамматики, после чего все прошло так, как (я) ожидал.

Включение правила перезаписи -> ^(PROGRAM<Program> program var function) создает следующие ATS:

enter image description here

и при включении правила перезаписи -> ^(PROGRAM program var function) вместо этого создается следующий AST:

enter image description here

Я проверил оба правила переписывания в следующем классе:

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);
    }
}

И изображения создаются с использованием graph.gafol.net (и, конечно, с выходом класса Main).

...