ANTLR: тест грамматики для необязательного параметра (с использованием оператора?) - PullRequest
1 голос
/ 11 июня 2009

У меня есть грамматика ANTLR, и я определяю функцию на моем языке, которая допускает необязательный параметр. Как я могу проверить, передан ли необязательный параметр в блок генерации кода?

Я в основном ищу синтаксис, чтобы сделать что-то вроде этого гипотетического оператора грамматики дерева:

myFunc returns [int retval] : 'myFunc' arg1=number arg2=string?
{
    // Check if arg2 exists.
    if (/* arg2 exists */) { $retval = $arg1.value + 10; }
    else { $retval = $arg1.value; }
}

Любые предложения или ссылки на документацию приветствуются!

Ответы [ 3 ]

3 голосов
/ 12 июня 2009

Вы должны просто проверить, является ли arg2! = Null.

0 голосов
/ 13 июня 2009

Если вы хотите, чтобы это было более общим, то вместо жесткого кодирования одного необязательного параметра ваш код может анализировать несколько элементов, например:

myFunc returns [int retval] 
: 'myFunc' funcArgs
{
   // Here you can run through the funcArg Tree and do what
   // ever you'd like here.
}

protected
funcArgs
: arg (COMMA arg)*
0 голосов
/ 12 июня 2009

Ответ Скотта работает как шарм!

Получает способ ссылаться на переменные, определенные ANTLR, в операторе if: без знака доллара ($), тогда как в остальное время требуется $.

Кроме того, чтобы проверить наличие более сложной структуры, чем простая строка, используйте

if (arg2.tree != NULL)
...