Требование соответствия скобок в 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
;