2013-11-21 3 views
0

В примере LabeledExpr.g4 в книге описано, как использовать классы посетителей для одиночных игр. Но если я хочу посетить класс, который является коллекцией, как мне это сделать? например для грамматики:Как написать классы посетителей для коллекций?

prog: stat+ ; 
stat: expr NEWLINE # printExpr 
     ; 

Функция посетителя для печати показана как:

public Integer visitPrintExpr(LabeledExprParser.PrintExprContext ctx) { 
    Integer value = visit(ctx.expr()); // evaluate the expr child 
    System.out.println(value);   // print the result 
    return 0;       // return dummy value 
} 

Что бы соответствующую функция посетителя для «стата +», так что я могу пройти список «стат» ?

Причина, по которой я ищу это, я могу сначала проанализировать и сохранить всю объектную модель в памяти, а затем выполнить несколько проходов посещения и анализа (вместо того, чтобы «на лету» оценивать/печатать как показывает пример книги).

Связанный вопрос: если я создаю некоторые структуры данных в файле грамматики (как показано в ActionExpr.g4 в книге), как мне получить доступ к этим структурам данных в функциях посетителя? например как получить доступ к классу Expr, созданному ниже, в функции посетителя?

stat [Expr e] 
     : expr NEWLINE # printExpr 
      {$e = new Expr($expr);} 
     ; 

ответ

0

Полная коллекция возвращается сгенерированным способом ProgContext.stat(). Вы можете получить доступ к нему из метода visitProg посетителя.

+0

Спасибо. Но теперь у меня другая проблема - код работает в eclipse, но не в командной строке (ни окна, ни unix). Я задал другой вопрос, потому что это похоже на ошибку - 20138858. – R71

Смежные вопросы