Требование соответствия скобок в ANTLR

Я знаю, что в ANTLR4 я могу использовать? за 0 или 1 раз. Но, например, для идентификаторов, пользователь может использовать или не использовать круглые скобки. Но если я сделаю это

'('? identifier ')'?

Синтаксический анализатор разрешит заявления как: '(x' or 'y)' вместо того, чтобы требовать (x), Есть ли способ требовать совпадения скобок при определении вашей грамматики в ANTLR4?

2 ответа

Вы можете определить альтернативу с круглыми скобками и альтернативой без каких-либо, например,

expression: 
    '(' identifier ')'
    | identifier
;

Если вы хотите разрешить идентификаторы между '(' и ')' или без скобок, вы можете просто использовать для этого две альтернативы вместо ? оператор:

'(' identifier ')' | identifier

Обратите внимание, что это позволит только один набор скобок. Чтобы разрешить произвольное число, вы должны использовать рекурсивное правило, подобное этому:

identfiierWithParens
    : '(' identifierWithParens ')'
    | identifier
    ;

Поскольку в большинстве языков произвольные выражения могут быть заключены в круглые скобки (а идентификаторы могут использоваться только в том случае, если они используются в качестве выражений или других сущностей, которые могут заключаться в круглые скобки, как это), вы обычно обрабатываете это как часть вашего expression Правило вместо:

expression
    : identifier
    | '(' expression ')'
    | // other types of expression
    ;
Другие вопросы по тегам