antlr2 возвращает несколько значений - PullRequest
0 голосов
/ 13 декабря 2011

Как заставить правило возвращать несколько значений в antlr2. Например:

declSpecifiers returns [int mods]
        : ( storageClassSpecifier    
        | typeQualifier       
        | typeSpecifier)+
        ;

У меня есть некоторая другая информация, кроме 'модов' для возврата. Что мне делать?

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

В ANTLR v2.x вы можете вернуть только одно значение, в отличие от ANTLR v3.x, где несколько возвращаемых значений автоматически переносятся контейнером, содержащим несколько возвращаемых значений.

Вам придется возвращатькакая-то коллекция или пользовательский объект:

declSpecifiers returns [Map map]
{map = new HashMap();}
  : ( storageClassSpecifier { /* populate your map here */ }
    | typeQualifier         { /* populate your map here */ }
    | typeSpecifier         { /* populate your map here */ }
    )+
  ;

Полагаю, вы знаете, что ANTLR v2 довольно старый: если вы можете, перейдите на v3 (я знаю, что это не всегда вариант ... но все же).

1 голос
/ 13 декабря 2011

В ANTLR v3.x вы можете включить несколько возвращаемых значений, перечислив их в скобках.

declSpecifiers returns [int mods, Object otherInfo]
        : ( storageClassSpecifier    
        | typeQualifier       
        | typeSpecifier)+
        ;

Сгенерированный код вернет сгенерированный класс, содержащий поля для всех возвращаемых значений, используя предоставленные вами имена.

...