Есть ли в XText операция переопределения для восстановления только части правой части правила без необходимости называть ее

В grako можно использовать @:e для вызова оператора переопределения, который делает AST для всего правила AST для e. Если добавлено более одного элемента, запись преобразуется в список. Оператор переопределения полезен для восстановления только части правой части правила без необходимости называть ее, а затем добавления семантического действия для восстановления интересующей части.

Есть ли в Xtext что-нибудь подобное? Я знаю, что + = приведет к списку, но я не могу найти способ не делать что-то вроде X+=stuff, где X - имя lhs

Например, как это перевести в xtext

X1 =@:x{',' @:x}* ';'

Хотя мой оригинал был

X1:  <not sure> +=x (',' <not sure>+=x)* ';' ;

____EDIT ______ Идея состоит в том, что для всех именованных списков в операторах, то есть nameList1 list1, nameList2 list2, nameList3 list3

Я могу вызвать правило stmt_list, которое поместит элементы в правильный список 'операторов' ('nameList1' list1 + = stmt_list | 'nameList2' list2 + = stmt_list) * 'nameList3' list3 +: stmt_list

stmt_list:
    stmt_list+=stmt_def (',' stmt_list+=stmt_def )* ';';

Итак, здесь stmt_list + = должен соответствовать правильному списку, который его вызвал.

Таким образом, когда я буду писать свой язык после того, как правила будут проанализированы, я смогу написать что-то вроде этого

  nameList1 foo(a, b, c, d)
  nameList1  bar(e);
  nameList2  zap();
  nameList3 zip();

где a, b, c, d, e попадут в список с правильным именем

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

( 'nameList1' list1+=stmt_def (',' list1+=stmt_def )* ';';
| 'nameList2' list2+=stmt_def (',' list2+=stmt_def )* ';';
 'nameList3' list3+=stmt_def (',' list3+=stmt_def )* ';';

person Quantico    schedule 22.04.2016    source источник


Ответы (1)


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

обычно используется для записи выражений https://typefox.io/parsing-expressions-with-xtext < / а>

вы могли бы сделать что-то вроде следующего, но я не знаю, хотите ли вы это сделать

Model:
    (things+=Thing ";")*
;

Thing:
    SimpleThing (({ThingList.things+=current}"," things+=SimpleThing) ("," things+=SimpleThing)* )?
;

SimpleThing:
    name=ID
;
person Christian Dietrich    schedule 23.04.2016
comment
добавил правку к моему вопросу, чтобы лучше объяснить. У меня есть два вопроса о вашем текущем ответе, где вы определяете вещи. может ли вещь содержать вещь или простую вещь, а вещь может также содержать простую вещь? почему things.list есть .things? - person Quantico; 24.04.2016
comment
Я до сих пор не понимаю, каковы ваши требования. Можете ли вы объяснить с помощью модели и того, что вы хотите создать. в моем случае вещь может быть либо простой вещью, либо списком вещей, который представляет собой список простых вещей. (например, вы пишете запятую, она автоматически превращается в список. и левая сторона (иначе current назначается членом этого списка). поскольку в xtext нет такой вещи, как все, это список или dict (с использованием терминов из grako doc), но все это dict с возможностью (типизированных) значений может быть списком, который я должен ввести ThingList как явный именованный тип - person Christian Dietrich; 24.04.2016
comment
а где вы определили ThingList? Кроме того, я попытаюсь еще раз объяснить, что у меня есть «statments», которое является ключевым словом, под ним может быть несколько списков списка, например type1 имеет список stmt1. у каждого из этих списков есть список stmt_list, в stmt_list я пытаюсь поместить X в этот stmt_list - person Quantico; 25.04.2016
comment
Thinglist создан. - person Christian Dietrich; 25.04.2016
comment
Если вы просто хотите добавить материал в список, используйте list + = Stuff (, list + = Stuff) * - person Christian Dietrich; 25.04.2016
comment
И таким образом невозможно смешивать списки, если вы этого хотите. Поэтому вы бы переместили список в главное правило, которое у вас уже есть 'type1' listEkememts + = ListEkement - person Christian Dietrich; 25.04.2016
comment
Думаю, я плохо себя объяснил. Идея слышать, что у меня есть несколько списков с разными именами 'type1' stmt1 + = stmt_list, например список stmt1 с именем 'type1', и я хотел бы добавить элементы в этот список, элементы, разделенные a, и оканчивающиеся на; так как у меня есть несколько разных списков с разными именами, но все они должны поддерживать одну и ту же структуру, и;. Идея stmt_list состоит в том, чтобы быть тем общим правилом, которое просто будет знать, чтобы добавить элемент в именованный список, чтобы вызвать правило. поэтому @ kind указывает на последний именованный список, который вызвал это правило. - person Quantico; 25.04.2016
comment
Снова отредактировал вопрос - person Quantico; 25.04.2016
comment
общие списки / шаблоны невозможны - person Christian Dietrich; 26.04.2016