Если вы хотите разрешить идентификаторы между '(' и ')' или без скобок, вы можете просто использовать две альтернативы для этого вместо оператора ?
:
'(' identifier ')' | identifier
Обратите внимание, что этопозволит только один набор скобок.Чтобы разрешить произвольное число, вы должны использовать рекурсивное правило, подобное следующему:
identfiierWithParens
: '(' identifierWithParens ')'
| identifier
;
Поскольку в большинстве языков произвольные выражения могут быть заключены в скобки (а идентификаторы могут использоваться только в том случае, если они используются в качестве выражений илидругие сущности, которые могут быть заключены в скобки, как это), вы обычно обрабатываете это как часть вашего expression
правила вместо:
expression
: identifier
| '(' expression ')'
| // other types of expression
;