Требование соответствия скобок в ANTLR - PullRequest
0 голосов
/ 23 сентября 2018

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

'('? identifier ')'?

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

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

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

'(' identifier ')' | identifier

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

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

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

expression
    : identifier
    | '(' expression ')'
    | // other types of expression
    ;
0 голосов
/ 23 сентября 2018

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

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