Интерпретация переменного числа узлов дерева в ANTLR Tree Grammar - PullRequest
4 голосов
/ 04 февраля 2010

При создании встроенного интерпретатора ANTLR Tree Grammar я столкнулся с проблемой, касающейся множества аргументов вызова процедуры.

Рассмотрим следующее (ошибочное) определение грамматики дерева.

procedureCallStatement
   :    ^(PROCEDURECALL procedureName=NAME arguments=expression*)
        {
            if(procedureName.equals("foo")) {
                callFooMethod(arguments[0], arguments[1]);
            }elseif(procedureName.equals("bar")) {
                callBarMethod(arguments[0], arguments[1], arguments[2]);
            }
        }
   ;

Моя проблема заключается в получении данных аргументов. Если бы было известное количество выражений, я бы просто присвоил значения, выходящие из этих выражений, их собственной переменной, например ::10000

procedureCallStatement
   :    ^(PROCEDURECALL procedureName=NAME argument1=expression argument2=expression)
        {
            ...
        }
   ;

Это, однако, не так.

В случае, подобном этому, какова рекомендация по интерпретации переменного числа узлов дерева, встроенных в грамматику дерева ANTLR?

1 Ответ

4 голосов
/ 04 февраля 2010

Используйте оператор +=.Чтобы обработать любое количество аргументов, включая ноль:

procedureCallStatement
   :    ^(PROCEDURECALL procedureName=NAME argument+=expression*)
        {
            ...
        }
   ;

См. Документацию по для построения дерева на веб-сайте antlr.

Приведенное выше изменит тип переменнойargument от typeof(expression) до List (по крайней мере, когда вы генерируете код Java).Обратите внимание, что типы списков не типизированы, поэтому это просто обычный список.

Если вы используете несколько параметров с одинаковым именем переменной, они также создадут список, например:

twoParameterCall
   :    ^(PROCEDURECALL procedureName=NAME argument=expression argument=expression)
        {
            ...
        }
   ;
...