Я немного изменил ваши примеры: я добавил точку с запятой в конец и поставил другую пару скобок во втором примере. Я сделал вывод, что эти изменения основаны на том, что вы указали в своей грамматике. Вот примеры:
CREATE boby = sacha - ( boby & tralaa);
CREATE boby = sacha & (boby - ( david & lucas ));
Для разбора подобных примеров ваша грамматика должна быть изменена на:
- Взять в несколько
Model
с (я создал Script
правило, которое принимает модели, разделенные точкой с запятой)
- Разрешить свойству
second
правила SetBaseExpr
быть идентификатором или SetParExpr.
- Измените
Identifier
на ID
в правиле модели (я полагаю, это то, что вы имели в виду).
Я внес эти изменения и получил следующую грамматику, которая анализирует примеры, которые я дал:
Script:
models+=Model[';'] ';'
;
Model:
'CREATE' name=ID '=' exp=SetExpr
;
JoinOperator: '-' | '&';
SetExpr:
SetParExpr | SetBaseExpr
;
SetBaseExpr:
first=ID op=JoinOperator (second=ID | second=SetParExpr)
;
SetParExpr:
'(' SetExpr ')'
;
Я надеюсь, что это ответит на ваш вопрос или даст подсказку, как обрабатывать выражения в скобках.