Групповые терминалы в комплект

Group terminals into sets

Что означает это предупреждение? Как его решить?

Вот код, который я имею в виду

expression : expression operator=DIV expression
           | expression operator=MUL expression
           | expression operator=ADD expression
           | expression operator=SUB expression
           | INT
           | FLOAT
           | BOOLEAN
           | NULL
           | ID
           ;

Ответ 1

Генератор парсеров ANTLR 4 может объединять группы переходов для формирования единого "набора переходов" в некоторых случаях, уменьшая накладные расходы на статическую и динамическую память, а также улучшая производительность во время выполнения. Это может произойти только в том случае, если все альтернативы блока содержат один элемент или набор. Например, следующий код позволяет объединить INT и FLOAT в один переход:

// example 1
number
    :   INT
    |   FLOAT
    ;

// example 2, elements grouped into a set
primary
    :   '(' expression ')'
    |   (INT | FLOAT)
    ;

Однако в следующей ситуации элементы не могут быть объединены компилятором, поэтому они будут обрабатываться отдельно:

primary
    :   '(' expression ')'
    |   INT
    |   FLOAT
    ;

В подсказке предлагаются места, где простого добавления (... ) достаточно, чтобы компилятор мог свернуть набор, который в противном случае он не смог бы. Изменение кода на следующее предупреждение.

expression
    :   expression operator=DIV expression
    |   expression operator=MUL expression
    |   expression operator=ADD expression
    |   expression operator=SUB expression
    |   (   INT
        |   FLOAT
        |   BOOLEAN
        |   NULL
        |   ID
        )
    ;