Как разобрать выражение с круглыми скобками? - PullRequest
0 голосов
/ 11 мая 2019

Я хотел бы проанализировать выражение с круглыми скобками в python, используя textx.

Например, следующий DSL:

CREATE boby = sacha - ( boby & tralaa) ; 

CREATE boby = sacha & boby - ( david & lucas )

Это грамматика, которую я пробовал:

Model:
    'CREATE' name=Identifier '=' exp=SetExpr
;

JoinOperator: /-/&/;

SetExpr:SetParExpr | SetBaseExpr 
;

SetBaseExpr:
    first=ID op=JoinOperator second=ID
;

SetParExpr:
    '(' SetExpr ')'

Я думаю, у меня должен быть список где-нибудь, чтобы заполнить его выражением.Есть ли у вас предложения ?

1 Ответ

0 голосов
/ 07 июня 2019

Я немного изменил ваши примеры: я добавил точку с запятой в конец и поставил другую пару скобок во втором примере. Я сделал вывод, что эти изменения основаны на том, что вы указали в своей грамматике. Вот примеры:

CREATE boby = sacha - ( boby & tralaa);

CREATE boby = sacha & (boby - ( david & lucas ));

Для разбора подобных примеров ваша грамматика должна быть изменена на:

  1. Взять в несколько Model с (я создал Script правило, которое принимает модели, разделенные точкой с запятой)
  2. Разрешить свойству second правила SetBaseExpr быть идентификатором или SetParExpr.
  3. Измените 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 ')'
;

Я надеюсь, что это ответит на ваш вопрос или даст подсказку, как обрабатывать выражения в скобках.

...